zoukankan      html  css  js  c++  java
  • swift小结02-基础篇

    闭包
         类似于 OC 中的 Block,是一段预先定义好的代码,在需要时执行
     
    闭包表达式格式:
     { (形参名称1: 形参类型1, 形参名称2: 形参类型2, ...) -> 返回值 `in`
              //要执行的代码
      }
    in 用于区分闭包定义和代码实现
     
      //定义有参数a的闭包
        let coluse = { (a:String)->Void in
            print("xxxxx(a)")
        }
       
        //定义无参数的闭包
        let coluse1 = {
           
        }
        let coluse2 = {()->Void in
           
        }
     
     // 尾随闭包
            // 当闭包是最后一个参数的时候, 将闭包放在参数整个()外面
            UIView.animateWithDuration(0, animations: { () -> Void in
                print("aa")
            })
     

    闭包使用场景(回调)
      //1.定义闭包
            let cal = {(result:String)->Void in
                print("闭包的参数是(result)")
            }
            //调用方法
            loadDate(cal)
     
        }

        //2.创建方法,闭包callback:(String)->Void作为方法的参数
        func loadDate(callback:(String)->Void) ->Void{
            //异步
            dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
                //2
                NSThread.sleepForTimeInterval(2)
                //回到主线程
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    //设置回调的参数
                    let callString = "什么鬼"
                    //3.调用回调
                    callback(callString)
                })
            }
        }
     

    定义类
    • ( )里面是空,表示调用类的默认构造函数 = [[类名 alloc] init];
    •   实例化一个类:
        var 变量名 = 类名()
    class 类名: 父类名 {
          //: 一些属性
          //: 一些方法
      }
     
    注意:
      1.Swift的继承和OC一样是通过:, Swift也只有单继承
     2.访问类的属性和调用类的方法都是通过.来进行的
      3.覆盖父类方法, 需要加关键字 override
     
    类的属性
      • OC 中的属性:
        • @property(noatomic, copy) NSString *name;
          • 1.在.h声明 getter 和 setter 方法
          • 2.在.m实现 getter 和 setter 方法
          • 3.在.m生成 _成员变量
      • Swift 中属性分为:存储型属性计算型属性
        • 存储型属性: 存储数据
        • 属性监视器: 当存储型属性发生改变的时候,通知我们属性发生了改变,可用于监视值的改变
          • willSet: 在属性将要发生改变时调用
          • didSet: 在属性已经发生改变时调用(常用)
     
    计算型属性: 不存储任何数据,只生成 gettersetter,当只提供 get 方法时,称之为只读计算属性.必须要有 get 方法
        • 计算型属性 相当于 OC 中的 @property 生成的 gettersetter 方法,只不过 setter 方法没有给 _成员变量 赋值

        // 存储型属性: 专门负责存储数据的
        /*
            存储型属性有属性监视器:监视值的改变
                1.willSet: 值在改变前调用,了解,一般用不到
                2.didSet: 值改变后调用, 这个用的多,如刷新列表数据
        */newValue表示之前的值
        var name: String = "liudehua" {
            willSet {
                print("值改变前: (newValue)")
            }
           
            didSet {
                print("值改变后: (name)")
            }
        }
       
        // 计算型属性: 提供getset方法,里面写什么代码根据业务需求来
        // 当计算性属性,只提供get方法时,成为只读计算性属性,不能只有set没有get
        var nikeName: String {
            get {
                return "hehe"
            }
            set {
                // newValue就是外面设置的值
                print("别人设置了 nikeName 属性,值为 (newValue)")
            }
        }
        

    构造函数
    作用:在对象实例化过程中给所有的存储型属性设置初始值,并且执行必要的准备和初始化任务.
    便利构造函数
      • 便利构造函数: 它是辅助性的构造函数.方便创建对象
      • 默认情况下,所有的构造函数都是指定构造函数 Designated
      • convenience 关键字修饰的构造方法就是便利构造函数
      • 便利构造函数可以返回 nil
      • 需要调用本类的一个指定构造函数
     
    构造函数小结
      • 1.不需要func关键字.名称是固定的,都叫 init
      • 2.如果子类没有实现构造函数.会继承父类的构造函数
      • 3.子类构造函数需要调用父类构造函数
      • 4.需要先初始化子类属性,在调用父类构造函数
      • 5.子类一旦实现了构造函数.就不会继承父类的构造函数
     
     // 构造函数给属性赋值
        // 构造函数,先给自己的属性赋值,在调用父类的构造函数
        override init() {
            self.name = "liudehua"
            super.init()
        }
       
        // 重载: 函数名称一样,但是参数不一样
        init(name: String) {
          // 先给自己的属性赋值
            self.name = name
            super.init()
        }
    //子类与父类不能有相同名字的属性,但是不是继承关系的两个类可以有相同名字的属性和方法
        //便利构造函数
        convenience init?(stu_name:String,stu_grade:Float){
            if stu_grade < 0 || stu_grade > 100{
                print("非人类分数")
                return nil
            }
            //需要调用自身的指定构造函数或便利构造函数,不能调用父类的
            self.init(name:stu_name,grade:stu_grade)
        }
       
       
        convenience init?(s_name:String,s_grade:Float){
            //调用自身的便利构造函数
            self.init(stu_name:s_name,stu_grade:s_grade)
        }
     

    懒加载
          // 懒加载方式1
        lazy var person: Person = Person(name: "小强", age: 20)
        lazy var arr: NSArray = NSArray()
        // 懒加载方式2(完整写法)
        lazy var person2: Person = { () -> Person in
            let p = Person(name: "强强", age: 22)
           
            return p
        }()
       
        //(默认写法)除了创建对象,还可以做一些初始化操作
        lazy var person2: Person = {
            let p = Person(name: "强强", age: 22)
            // 此处来1000行代码
            let p1 = NSArray()
            return p
        }()

     待续。。。
     
     
     
  • 相关阅读:
    损失函数VS评估指标
    协程到底是什么?看完这个故事明明白白!
    一个故事看懂AI神经网络工作原理
    一个爬虫的故事:这是人干的事儿?
    深夜,我偷听到程序员要对session下手……
    突然挂了!Redis缓存都在内存中,这下完了!
    还不懂Redis?看完这个故事就明白了!
    可怕!公司部署了一个东西,悄悄盯着你!
    小白怎么入门网络安全?看这篇就够啦!
    CPU有个禁区,内核权限也无法进入!
  • 原文地址:https://www.cnblogs.com/somethingWithiOS/p/5678077.html
Copyright © 2011-2022 走看看