Swift 计算属性、存储属性

属性

Swift中的属性分为存储属性(sorted variable)和计算型属性(computed variable)

存储型属性就是一般意义上理解的可以进行赋值和取值的变量。
var title = "学科"
计算型属性,字面意思为计算型的属性,这种属性没法存储值

计算型属性

特征:仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口

  • 计算型属性本身不占用内存内控,所以不能赋值
    get+set为计算型属性的原因:
    真正赋值的过程是存在于set方法中并被底层包装掉的,如果我们手动实现了set方法,就无法进行正确的赋值


    图片.png

    get+set正确的使用方法:作为其他属性的外部接口

    private var _squre: Double = 0.0
    var squre: Double {
        get {
            return _squre
        }
        set {
            if (newValue <= 0) {
                print("newValue = \(newValue)")
            } else {
                _squre = newValue
            }
        }
    }

存储型属性

ps:初始化方法生成对象,并不会出发属性的willSet didSet方法若想再初始化阶段触发didSet,可以采用KVC的方式给对象初始化

willSet能获取将要赋给属性的值newValue

  • 操作的属性是对旧值操作,会被之后的内部set覆盖掉
  • 作用:观察
    didSet能获取属性之前的旧值oldValue,新值即为属性
  • 操作属性是对新值进行操作
  • 作用:观察、数据加工
  • 当使用了didSet就不能再使用set了,因为didSet中已经包含了set状态
class TestCard {
    init(width: Double) {
        self.width = width
    }
    var width: Double {
        willSet {
            print("willSet方法被调用")
            print("在willSet中,width = \(width),newValue = \(newValue)")
        }
        
        didSet {
            print("didSet方法被调用")
            print("在didSet中,width = \(width),oldValue = \(oldValue)")
        }
    }
}

初始化方法生成对象,并不会触发属性的willSet didSet方法

   // 初始化方法 不会触发 willSet didSet
        let card = TestCard.init(width: 10.0)

改用KVC的方式给对象初始化,就可以调用didSet了:

  • 修改:继承NSObject重新构造函数、属性前加@objc、属性变为必选类型并给默认值。 setValue(width, forKey: "width")
class TestCard: NSObject {
    init(width: Double) {
        super.init()
        setValue(width, forKey: "width")
    }
    @objc var width: Double = 0.0 {
        willSet {
            print("willSet方法被调用")
            print("在willSet中,width = \(width),newValue = \(newValue)")
        }
        
        didSet {
            print("didSet方法被调用")
            print("在didSet中,width = \(width),oldValue = \(oldValue)")
        }
    }
}
图片.png

计算型属性与懒加载

计算型属性:只是为了调用其他属性而包装的读取方法
    //计算型属性:只是为了调用其他属性而包装的读取方法
    var title: String? {
        get {
            return "所选学课:" + "\(name)"
        }
    }
  • 不分配独立的存储空间
  • 每次调用时都会被执行

懒加载

  • 在第一次调用时,执行闭包并且分配空间存储闭包返回的内容
  • 会分配独立的存储空间
  • 与OC不同的是lazy属性即使被设置为nil也不会被再次调用
    lazy var title: String = {
    return "所选学课:" + "(name)"
    }()

你可能感兴趣的:(Swift 计算属性、存储属性)