Swift - 初始化器补充和反初始化器

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之间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值