十五、Swift3.0之构造函数(本类和子类)和重载构造函数

本类必选属性的构造函数。

/*
必选属性的构造过程:
1、给自己的属性分配空间并设置初始值
2、调用父类的构造函数,给父类的属性分配空间并设置初始值
以上这两个顺序和OC相比是完全相反的,OC中是先调用父类的方法,然后给自己的属性分配空间并设置初始值。
var name: String
//override表示重写
override init() {
    name = "zhang"
    super.init()
}
*/
class Person: NSObject {
   var name: String
   //override表示重写
   override init() {
       name = "zhang"
       super.init()
       
   }
}

子类的必选属性的构造过程。


/*
 子类的必选属性的构造过程,注意Student是Person的子类,所以可以直接使用Person类中的name属性,但是和自身类的属性初始化不一样,设置name属性的值,要放在super.init()之后。
 */
class Student: Person {
    var no: String
    override init() {
        //这是本类的属性
        no = "001"
        super.init()
        //这是父类的属性
         name = "li"
    }
}

构造函数总结:
1、非Optional属性都必须在构造函数中设置初始值。从而保证对象在被实例化的时候,属性都被正确的初始化。
2、必须在调用父类构造函数之前,必须保证本类的属性都已经完成初始化。即属性设置初始值,必须在调用super.init()之前。

重载构造函数。

class Person: NSObject {   
    //重载:和重写相比,函数名相同,但是参数个数不同  如:override init() 和init(name: String)
    //重载的好处:重载可以给自己的属性从外部设置初始值
    //思考:OC中是否有重载?
    //答:没有,initWith***
    init(name: String) {
        print("person init 重载")
        //为了区分不同的name,这里要使用self. 否则xcode无法识别
        self.name = name
        super.init()
    }
}

推荐阅读更多精彩内容