美文网首页
Swift 计算属性、存储属性

Swift 计算属性、存储属性

作者: pigLily | 来源:发表于2022-02-16 15:14 被阅读0次

    属性

    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 计算属性、存储属性

          本文链接:https://www.haomeiwen.com/subject/xjcdlrtx.html