Swift中的计算机属性setter/ getter

1. 仿照OC 来写set/get方法

import UIKit

class Person: NSObject {

    private var _name: String?
    
    // 仿照 OC来写get/set  这种方式几乎不用
    // 格式: 属性声明之后 + {set/ge} 
    var name: String?{
        
        // 仿照OC中, get方法返回带有下划线的成员变量!
        // 在Person类中, 没有带有下划线的成员变量, 那我们就自己声明一个.
        // 仿照OC中, 在外界无法使用 点语法, 点出带有下划线的成员变量, 这里就需要添加 private关键字来修饰
        // private: 私有的, 用来修饰属性或者方法, 告知属性或方法只能在其类内部使用.
        get{
            return _name
        }
        
        // 仿照OC中, set方法就是对带有下划线的成员变量进行赋值
        // 这种方法里系统默认就会提供 newValue, 也就是外界给赋的值
        set{
            _name = newValue
        }
    }
}

2. 只读属性的写法

import UIKit

class Person: NSObject {
    
    var name: String?
    
    // 只读属性写法 01
    var title: String?{
        get{
            // 这种情况, 当外界为name赋值之后, 打印title就会出现错乱的状态
            // 打印结果: Optional("我叫Optional(\"Tom\")")
            // 原因: 第一个Optional 是因为title为可选值; 第二个Optional 是因为name为可选值;
//            return "我叫" + "\(name)"
            
            // 这种情况, 不管外界对name赋值与否, 都能正常打印了
            // 打印结果: Optional("我叫Tom")
            return "我叫" + "\(name ?? "")"
        }
    }
    
    // 注意: 当一个属性为 只读属性时, get{} 可以省略不写, 因此可以得出:
    // 只读属性写法 02 
    var title2: String?{
        return "我叫" + "\(name ?? "")"
    }
}

3. 存储型属性和计算型属性

/*
 - 存储型属性 既能存又能取, 需要开辟内存空间.
 - 计算型属性 只能取(只能读), 执行函数时直接返回其他内存地址; 自己不分配独立空间保存计算结果, 每次执行都会被调用.
 */

4.计算型属性和懒加载

import UIKit

// 懒加载(lazy) 和 计算型属性(只读属性) 写法有点相似...
class Person: NSObject {
    
    var name: String?
    
    /* 懒加载
     1. 在第一次调用时, 执行闭包, 并且分配空间存储闭包返回的数据值.
     2. 会分配独立的存储空间.
     3. 与OC 不同的是, 即便初始化结果为nil, 也算初始化成功, 再也不会被调用了.
     */
    lazy var title: String = {
        
        return "我叫" + "\(name ?? "")"
    }()
    
    /* 计算型属性
     1. 只读
     2. 不分配独立存储的控件保存计算结果
     3. 更像一个函数, 不过不能接受参数,但必须要有返回值
     */
    var title1: String?{
        return "我叫" + "\(name ?? "")"
    }
}

5. as! (类型的强转)

    // 以tableView初始化cell为例
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // as! 肯定可以转成我想要的类型 相当于OC中(PersonCell *)
        let cell = tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath) as! PersonCell
        return cell
    }

6. description (通过自定义模型来理解)

import UIKit

/* description
 OC 中 是一个方法
 Swift中 是一个属性,一个只读属性, 打印模型属性时候使用方便一点
 */
class PersonModel: NSObject {
    
    var name: String?
    var age: Int = 0
    
    // kvc构造函数 - 在这里是原生的字典转模型
    init(dict:[String: Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
    
    // swift中写法
    override var description: String{
        // keys
        let keys = ["name", "age"]
        return dictionaryWithValues(forKeys: keys).description
    }
    
    // 外界打印模型的时候, 结果: ["name": Tom, "age": 18]
}

7. didSet

  1. 在OC 中, 一般赋值都会重写set方法接收数据.
  2. 在Swift中, didSet方法就是最常用的赋值方法, 在之后笔记中, 将会以一个demo的形式详细说明.

你可能感兴趣的:(Swift中的计算机属性setter/ getter)