required
class Person {
var a:Int,b:Int
required init(a:Int,b:Int)
{
self.a = a
self.b = b
}
}
class Stuff: Person {
var c:Int = 10
init() {
self.c = 10
super.init(a: 10, b: 20)
}
required init(a:Int,b:Int)
{
self.c = 20
super.init(a: 10, b: 20)
}
}
var s = Stuff(a: 10, b: 20)
加了required之后,就必须去实现这个初始化器了,可以没有init(),但必须有required修饰的指定初始化器,required不能修饰便捷初始化器
属性观察器在父类不会被触发的原因
class Person
{
var age:Int
{
willSet
{
print("要来了")
}
didSet
{
print("已经来了")
}
}
init() {
self.age = 0
}
}
class Stuff: Person {
override init() {
super.init()
self.age = 10
}
}
let stu = Stuff()
总体只会调用一次willSet和didSet,因为在父类没有初始化完成的时候self.age = 0是初始化操作,父类本身并没有初始化完成,所以也不会触发属性观察器,而子类的调用在super.init()后面,这时候父类已经初始化完成了
可失败的初始化器
struct UserInfo {
var userID:String
init?(userID:String) {
if userID.isEmpty
{
return nil
}
self.userID = userID
}
}
if let u = UserInfo(userID:"")
{
print(u.userID)
}
else
{
print("初始化UserInfo失败")
}
可失败的初始化器就是在init后面加个问号,因为返回的是可选项,所以毕竟解包才能用,拿上述代码来说,当一个userID为空的时候,这个类肯定是有些问题的,可能是后台测试数据或者其它异常数据,这种情况下过滤掉一般是最好的
反初始化器
反初始化器就是OC的dealloc C++的析构函数
class UserInfo {
var userID : String
init(userID : String) {
self.userID = userID
}
deinit {
print("类销毁了")
}
}
func goBack() {
let u = UserInfo(userID: "123")
}
print("1")
goBack()
print("3")
比如这个反初始化器就会在函数结束之后调用,也就是1和3之间