关闭

关于Designated, Convenience 和 Required 区别

标签: swift
419人阅读 评论(0) 收藏 举报
分类:

关于Designated, Convenience 和 Required 区别
1.Designated (指定的)
顾名思义 在本文章中指的就是“Designated初始化方法”
在OC中,Init方法是非常不安全的,因为不能确保init只被调用一次,同时也不能确保init初始化方法调用后,实例内的每个变量都已经完成初始化。 因此在 Swift里对初始化方法加强了规范,确保每个实例初始化后,其内部的成员变量都已经完成初始化。
期间笔者还遇到一个小问题,let类型作为一个不变量 是不能被赋值的(这是对于构建线程安全的API很有用)。而在init方法里是可以进行赋值的,后来翻阅资料了解到,Swift的init方法只能被调用一次,所以在init方法中才可以赋值,而不会引起任何线程安全的问题。

2.Convenience (便利)
Convenience这类方法是Swift初始化方法中的“二等公民”相当于只要父类里面存在,我们就可以在子类中就可以使用。但是需要注意到的是Convenience的初始化方法是不能被子类重写或从子类中以super的方式调用。相当于子类不需要重写父类的这个初始化方法就可以使用
/示例/
class People {

var name: String

init() {

    name = "qq"

}

convenience init(number: Int) {
    self.init()
    name = String(number)
}

}

class TempPeople: People {

let page: Int

override init() {

    page = 10

}

}

/没有重写调用/
let model = TempPeople(number: 5)

3.Required (必需的)
如果你有一个父类的方法 必需强制要求所有子类重写,那就用到了Required。
/示例/

class People {

var name: String

required init() {

    name = "qq"

}

convenience init(number: Int) {
    self.init()
    name = String(number)
}

}

class TempPeople: People {

let page: Int

required init() {

    page = 10

}

}

这里的 TempPeople子类就必需要实现父类的init()方法

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:31609次
    • 积分:1409
    • 等级:
    • 排名:千里之外
    • 原创:116篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条