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)")
        }
    }
   
    // 计算型属性: 提供get和set方法,里面写什么代码根据业务需求来
    // 当计算性属性,只提供get方法时,成为只读计算性属性,不能只有set没有get
    var nikeName: String {
        get {
            return "hehe"
        }
        set {
            // newValue就是外面设置的值
            print("别人设置了 nikeName 属性,值为 \(newValue)")
        }
    }
    

构造函数
swift小结02-基础篇
作用:在对象实例化过程中给所有的存储型属性设置初始值,并且执行必要的准备和初始化任务.
便利构造函数
    • 便利构造函数: 它是辅助性的构造函数.方便创建对象
    • 默认情况下,所有的构造函数都是指定构造函数 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
    }()

 待续。。。
 
 
 
上一篇:iOS 面试题:OC基本概念题


下一篇:Android开发学习总结(五)——Android应用目录结构分析(转)