ios

Swift对象的初始化

2018-08-29  本文已影响2人  lkkwxy

Swift对象的初始化需要保证所有的非可选属性都被初始化。而初始化又分为designated和convenience两种。还有required,required可以和那两种方法进行组合。默认是非required,designated
规则如下:

  1. designated和convenience都可以有多个实现
  2. designated初始化方法里必须保证的非可选属性都被初始化.
  3. 子类的designated初始化方法必须调用父类的designated初始化方法。而且对自己的独有的属性(非继承来的)的赋值语句必须写在调用父类的designated初始化方法之前,如果想更改父类初始化方法中的赋值,则可以在调用父类初始化方法之后,再次进行更改
  4. convenience初始化方法必须调用自己的designated初始化方法
  5. extension里不能有designated初始化方法
  6. 如果子类里有自己的初始化方法,则也必须重写父类required的初始化方法。允许把required designated 重写成designated convenience,当然反过来也可以
  7. 如果子类里重写了父类required的初始化方法,则不会继承父类其他的初始化方法

针对第6,7两点的例子如下:

class Person {
    var name : String
    var age :Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    required convenience init(name: String) {
       self.init(name: name, age: 18)
    }
}
class Student: Person {
    var grades: [String] = []
    //把父类的required convenience重写成了required designated
    required init(name: String) {
        super.init(name: name, age: 18)
    }
}
//编译不通过 错误信息:Extra argument 'age' in call
//说明没有继承父类其他的初始化方法
let student = Student(name: "lkk", age: 22) 
上一篇 下一篇

猜你喜欢

热点阅读