目录
类的初始化器
一、指定初始化器
在书写Swift类的时候,我们会发现如图所示:
通过报错信息我们得知代码报错:Class Person has no initializers,而这也说明了当前的类,编译器默认不会为当前的类自动提供成员初始化器。但是对于结构体,编译器会提供默认的初始化器。但是我们在LGPerson类中给定属性默认值,系统就会自动执行默认初始化器。通常只有一个指定初始化器。
二、便捷初始化器
观察上图可以了解到便捷初始化器就是说在这之前需要我们确保类的子属性必须都要初始化完毕,这样存在的意义是我们可以“调用方便,不用传参”。
使用便捷初始化器的时候有几个注意的点,就是当这个类有派生类的时候,那么在派生类中需要注意:
1、指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。
2、指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖。
3、便捷初始化器必须先委托同类中的其它初始化器,然后再为任意属性赋新值(包括同类里定义的属性)。如果没这么做,便捷构初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。
4、初始化器在第一阶段初始化完成之前,不能调用任何实例方法、不能读取任何实例属性的值,也不能引用 self 作为值。
三、可失败初始化器
在Swift中是允许return nil的,我们将此称可失败初始化器,写法如下代码所示:
init?(_ age: Int, _ name: String) {
if age < 18 { return nil; }
self.age = age;
self.name = name;
}
let person = LGPerson.init(18, "")
print(person);//Optional(MySwift.LGPerson)
在Object-C中我们初始化一般都如下代码所示
//OC的初始化
- (instancetype)init {
self = [super init];
if (self) {
if (_age < 18){return nil}
}
return self;
}
LGPerson * p = [[LGPerson alloc] init];
NSLog(@"%p",p);//p=nil
四、必要初始化器
在类的初始化器前,添加required修饰符,来表明,所有该类的子类都必须实现改初始化器。具体现象如下图所示: