Swift 类的初始化器

375 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情


  1. Swift Optional
  2. Swift Enum
  3. iOS开发 做一个三角形
  4. Swfit 指针类型
  5. Swift 属性(下)
  6. Swift 属性
  7. Swift 小结
  8. Swift 类与结构体(下)
  9. Swift 类的生命周期
  10. Swift 类的初始化器
  11. Swift 类与结构体
  12. OpenGL 压缩纹理
  13. OpenGL 隧道坐标计算
  14. 0penGL 像素格式及数据类型
  15. OpenGL 纹理对象
  16. OpenGL 纹理
  17. OpenGL 模型变化
  18. OpenGL 视图
  19. OpenGL 矩阵
  20. OpenGL 向量
  21. OpenGL 颜色混合
  22. OpenGL 深度测试的潜在风险
  23. OpenGL 浅析深度测试
  24. OpenGL 浅析隐藏面消除
  25. OpenGL 图元连接方式
  26. 记WKWebView与HTML完成交互两三事
  27. OpenGL 渲染流程图解析
  28. OpenGL 控制你的正方形
  29. OpenGL 专业名词解释
  30. 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 关键字修饰符来表明所有该类的子类都必须实现该初始化器。