属性 Property
- getter & setter 方法
// getter & setter 仅供演示, 日常开发不用 private var _name: String? // Swift 中, 一般不会重写 getter 方法和 setter 方法 var name: String? { get { // 返回成员变量 return _name } set { // 使用 成员变量 记录值 _name = newValue } }
- 计算型属性(只读属性)
// OC 中定义属性的时候, 有一个 readonly ---> 重写 getter 方法 var title: String { // 只重写了 getter 方法, 没有重写 setter 方法 get { return "Mr. " + (name ?? "") } } // 只读属性的简写, 又称之为计算行属性: 本身不保存内容, 都是通过计算获得结果 // 类似于一个函数: 没有参数, 一定有返回值 var title2: String { return "Mr. " + (name ?? "") }
- didSet 方法
class DemoLabel: UILabel { // 模型 ---> 给视图设置模型, 由视图自己根据模型的数据显示内容 var person: Student? { // 就是替代 OC 中重写 setter 方法 // 区别: 再也不需要考虑 _成员变量 = 值 // OC 中如果是 copy 属性, 应该 _成员变量 = [值 copy] didSet { // 此时 name 属性已经有值, 可以直接使用设置 UI 内容 text = person?.name } } }
懒加载 Lazy
- 延迟加载, 减少内存的消耗
- 可以解除解包的烦恼
class ViewController: UIViewController { var label: DemoLabel? // 初始化并且分配空间 label, 会提前创建 // 在移动端开发, 延迟加载 减少内存消耗 // 懒加载 - lazy /* 1. 能够延迟创建 2. 最大的好处, 可以解除解包的烦恼 */ // lazy var label2: DemoLabel = DemoLabel() // 懒加载本质上是一个 闭包 // 懒加载会在第一次访问的时候执行, 闭包执行结束后, 会把结果保存在 属性 中 // 后续调用, 直接返回 属性 的内容 // 懒加载的属性会分配空间, 存储值 // 只要调用过一次, 懒加载后面的闭包再也不会执行了 // 完整写法 /* {} 包装代码 () 执行代码 日常开发: 1. 闭包中的智能提示不好 2. 闭包中如果出现 self. 还需要注意循环引用 */ lazy var label2 = { () -> DemoLabel in let l = DemoLabel() // 设置 Label 的属性... return l }() // 注意: 一旦 label 被设置为 nil, 懒加载也不会再次执行 // 懒加载的代码只会在第一次调用的时候, 执行闭包, 然后将闭包的结果保存在 label 的属性中 private lazy var label3: UILabel? = UILabel() override func viewDidLoad() { super.viewDidLoad() // 设置 UI setupUI() label3?.text = "hello" label3?.sizeToFit() print(label3 as Any) label3 = nil print(label3 as Any) } private func setupUI() { // 1. swvf控件 label = DemoLabel() // 添加到视图 // ! 解包, 为了参与计算, addSubView 用 subViews 数组记录控件, 数组中不允许加入 nil // ? 可选解包, 调用方法, 如果为 nil, 不调用方法, 但是不能参与计算 view.addSubview(label!) label?.text = "hello" label?.sizeToFit() label?.center = view.center } override func didReceiveMemoryWarning() { // Swift 中一定注意不要主动清理视图或者控件 // 因为懒加载不会再次创建 } }