Swift学习笔记---构造函数

2017-06-28  本文已影响0人  Warm_H

趁着最近有空闲的时间,想感受一下Swift的简洁and优雅,不过小菜鸟还在Swift的优雅简洁之路上匍匐前进,欢迎指正,共同学习进步……

构造函数:init()
作用:1.给成员变量分配空间 2.初始化

在OC中:1.调用父类方法super.init 分配空间 2.初始化 如下:

- (instancetype)init{
    //1.调用父类构造方法
    self = [super init];
    if (self) {
        //2.初始化
    }
    return self;
}

但在swift中与之相反:1.先实例化自己的对象 2.调用父类方法分配空间 如下:

//必选属性 的构造函数
//一般都为可选「除基本数据类型 后面有说到」
var name :String
 override init() {
        self.name = "lu"
        super.init()
    }
/**
必选属性 的构造函数
小结:1 .非optional的属性必须在构造函数中设置初始值,从而保证对象在实例化的时候,属性正确被初始化
     2.调用父类super.init 前,必须保证本类属性已初始化
     3.swift中 构造函数不用写 func
 */

重载/重写 构造函数
1.重写:override 关键字

 //重写 :父类存在相同方法,子类重新编写父类方法
 override init() {
        self.name = "lu"
        super.init()
    }

2.重载:overload

 //重载 [函数名相同 参数和参数个数不同]
    init(name:String) {
        //参数name给属性赋值
        self.name = name
        super.init()
    }
  //注:如果重载了构造函数 并且没有实现父类init方法 系统不在提init()
  //注:OC中没有重载 只有initwithxxxxx

KVC 构造函数

    //KVC 函数调用
    var sex : String?
    //1.定义模型属性【对象】时 一般是可选 避免写构造函数
    //var num :Int?
    var num :Int = 7
    //2.基本数据类型 不能设置成可选的 而且要设置一个初始值 否则会崩溃【必选】
    //3.private 属性 外界无法访问【KVC时 属性不能为private的】
    
     //使用字典给属性设置初始值
    init(dict:[String:AnyObject]) {
        //1.先调用父类 初始化完成
        super.init(name: "")
        //2.KVC方法
        setValuesForKeys(dict)
    }
/**
1.可选属性优点
小结:1.避免写构造函数,简化代码
     2.需要的时候再创建,节省内存
     3.定义模型属性【对象】时 一般是可选;
       基本数据类型 不能设置成可选的 而且要设置一个初始值 否则会崩溃,因为KVC找不到Key
2.KVC函数调用小结:
     (1)是OC的方法,运行时给对象发送消息,所以发消息前要保证对象已经实例化完成,因此调用KVC方法前 先要super.init,如上面代码
     (2)private 属性 【KVC时 属性不能为private的】
 */

便利构造函数:关键字 convenience

    convenience init?(name :String, age: Int) {
        if age > 100 {
            return nil
        }
        //1.实例化当前对象
        self.init()
        //2.访问对象属性 设置值
        self.name = name
        self.age = age
    }
/**
     1.允许返回nil 正常函数一定会创建对象
     --判断给定的参数条件是否符合,不符合就返回nil,不会创建对象,减少内存开销
     2.只有便利构造函数中使用self.init 构造当前对象
       --convenience
     3.访问对象的当前属性 一定在 self.init之后
     */

析构函数

 deinit {//析构函数 类似于dealloc
        /**
         1.通知
         2.KVO
         3.NSTimer/CADisplayLink
         */
    }
/**
 1.没有func ---->不让调用
 2.没有() ----> 不让重载
 3.对象销毁前 自动调用
 */

欢迎指正,共同进步……

上一篇下一篇

猜你喜欢

热点阅读