持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
- Swift Optional
- Swift Enum
- iOS开发 做一个三角形
- Swfit 指针类型
- Swift 属性(下)
- Swift 属性
- Swift 小结
- Swift 类与结构体(下)
- Swift 类的生命周期
- Swift 类的初始化器
- Swift 类与结构体
- OpenGL 压缩纹理
- OpenGL 隧道坐标计算
- 0penGL 像素格式及数据类型
- OpenGL 纹理对象
- OpenGL 纹理
- OpenGL 模型变化
- OpenGL 视图
- OpenGL 矩阵
- OpenGL 向量
- OpenGL 颜色混合
- OpenGL 深度测试的潜在风险
- OpenGL 浅析深度测试
- OpenGL 浅析隐藏面消除
- OpenGL 图元连接方式
- 记WKWebView与HTML完成交互两三事
- OpenGL 渲染流程图解析
- OpenGL 控制你的正方形
- OpenGL 专业名词解释
- OpenGL 环境搭建 - MacOS
上一篇,我们探讨了 Swift中 类与结构体的内容,今天我们来看一下Swift中 类的初始化器中的内容:
类的初始化器
需要注意的一点是:当前的类编译器默认不会自动提供成员初始化器,但是对于结构体来说编译器会提供默认的初始化方法(前提是我们自己没有指定初始化器)!
struct LGTeacher{
var age: Int var name: String
}
Swift 中创建类和结构体的实例时必须为所有的存储属性设置一个合适的初始值。所以 类 LGPerson 必须要提供对应的指定初始化器,同时我们也可以为当前的类提供便捷初 始化器(注意:便捷初始化器必须从相同的类里调用另一个初始化器。)
class LGPerson{
var age: Int
var name: String
init(_ age: Int, _ name: String) {
self.age = age
self.name = name
}
convenience init() {
self.init(age: 18, name:"Kody")
}
}
当我们派生出一个子类 LGTeacher之后 ,并指定了一个指定初始化器后会出现什么问题呢?如下所示:
class LGPerson{
var age: Int
var name: String
init(_ age: Int, _ name: String) {
self.age = age
self.name = name
}
convenience init() {
self.init(age: 18, name:"Kody")
}
}
class LGTeacher: LGPerson {
var subjectName: String
init(subjectName: String) {
self.subjectName = subjectName
}
}
这里我们需要整理记住一下几点:
- 指定初始化器必须保证在向上委托给父类初始化器之前,其所在类引入的所有属性都要初始化完成。
- 指定初始化器必须先向上委托父类初始化器,然后才能为继承的属性设置新值。如果不这样做,指定初始化器赋予的新值将被父类中的初始化器所覆盖
- 便捷初始化器必须先委托同类中的其它初始化器,然后再为任意属性赋新值(包括 同类里定义的属性)。如果没这么做,便捷构初始化器赋予的新值将被自己类中其它指定初始化器所覆盖。
- 初始化器在第一阶段初始化完成之前,不能调用任何实例方法、不能读取任何实例属性的值,也不能引用 self 作为值。
可失败初始化器:
这也很简单,好理解,可失败也就意味着当前因为参数的不合法或者外部条件的不满足的时候,存在初始化失败的情况。这种 Swift 中可失败初始化器写 return nil 语句, 来表明可失败初始化器在何种情况下会触发初始化失败。写法也非常简单。
必要初始化器:
这个也不难理解,在类的初始化器前添加 required 关键字修饰符来表明所有该类的子类都必须实现该初始化器。