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

Swift之计算属性和存储属性

作者: 小羊爱学习 | 来源:发表于2022-06-28 18:36 被阅读0次

计算型属性
特征:本质是方法/函数,不占用实例内存,不直接存储值,本身只起计算作用,仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口
get+set为计算型属性的原因:真正赋值的过程是存在于set方法中并被底层包装掉的,如果我们手动实现了set方法,就无法进行正确的赋值
1.计算属性可以用于类、结构体和枚举
2.计算属性只能(用关键字 var 定义)。
3.计算属性不直接存储值,而是提供一个 getter 和一个可选的setter,来间接获取和设置其他属性或变量的值

存储属性
特征:把常量或变量的值作为实例的一部分,可以直接读写赋值。
1.存储属性只能用于类和结构体**
2.存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字 let 定义)

上类代码:

class User: NSObject {

    //计算属性
    var hob: String{//                              ------------1
        return "hob"
    }
    var address222: String{//                       ------------2
        return self.address111
//        return address111
    }
    var address333: String{//                       ------------3
        get{
            return self.address111
        }
    }
    var address444: String{//                       ------------4
        get{
            return self.address111
        }
        set(newAddress){//                          ------------5
            self.address111 = newAddress
        }
    }
    var address555: String{//                       ------------6
        get{
            return self.address111
        }
        set{
            self.address111 = "新地址"
        }
    }
    
    
    //存储属性
    private var name: String?//                     ------------7
    private var address111: String = "地址111"//     ------------8
    var age:Int = {//                               ------------9
        return 5
    }()
    
    override init() {
        
    }
}

然后分别做几个测试,研究一下打印结果,为了方便理解,这里我就直接把打印结果写在每行代码后面

        let user = User()
        print(user.address222)//----地址111           a
        print(user.address333)//----地址111           b
        print(user.address444)//----地址111           c
        user.address444 = "jsc搬到了乡下"
        print(user.address444)//----jsc搬到了乡下      d
        print(user.address222)//----jsc搬到了乡下      e
        user.address555 = "jsc搬到了城里"
        print(user.address555)//----新地址            f
        print(user.address222)//----新地址            g

分析可得以下结论:
1.分析a、b、c处的打印可知道,类中3是2的完整版,2中省去了get方法
2.分析d、e处的打印,可知道,类是引用类型,可以通过类计算属性的set方法给类的私有变量进行修改
3.分析f打印可知道,类中可读可写的计算属性,set必须要有参数才可以复制

属性观察器
属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外。

可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重载属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。
ps:不需要为无法重载的计算属性添加属性观察器,因为可以通过 setter 直接监控和响应值的变化。
可以为属性添加如下的一个或全部观察器:

1.willSet在设置新的值之前调用
2.didSet在新的值被设置之后立即调用
3.willSet和didSet观察器在属性初始化过程中不会被调用
eg:

class Samplepgm {
    var counter: Int = 0{
        willSet(newTotal){
            print("计数器: \(newTotal)")
        }
        didSet{
            if counter > oldValue {
                print("新增数 \(counter - oldValue)")
            }
        }
    }
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800

相关文章

  • Swift:基础(二十)属性

    Swift 属性 Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性和计算...

  • OC的@property与Swift的存储属性/计算属性类比

    Swift中的计算属性/存储属性与OC中的@property   Swift中引入了存储属性、计算属性的概念,存储...

  • Swift进阶(三)--- 属性

    Swift的属性 在swift中,属性主要分为以下几种: 存储属性 计算属性 延迟存储属性 类型属性 一:存储属性...

  • 属性

    Swift 属性将值跟特定的类、结构或枚举关联。属性可分为存储属性和计算属性: 存储属性 计算属性存储常量或变量...

  • Swift 属性

    Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性 计算属性 存储常量或变...

  • Swift 属性

    Swift 属性 在Swift中属性主要分为存储属性、计算属性、延迟存储属性、类型属性这四种,并且Swift还提供...

  • Swift5中的存储属性和计算属性以及属性观察器

    Swift 属性将值跟特定的类、结构或枚举关联。 属性可分为存储属性和计算属性: 存储属性计算属性存储常量或变量作...

  • Swift 属性与下标

    swift中属性分为静态属性和存储属性,存储属性类似于OC中的数据成员,计算属性不存储数据 存储属性 存储属性适用...

  • 20170612基础知识-属性、下标、方法

    1、Swift中,属性分为存储属性、计算属性。 存储属性:存储数据,常量属性let,变量属性var,适用于类和结构...

  • Swift属性

    Swift属性分为存储属性,计算属性。或者分为实例属性,类属性。计算属性不存储值(像是一个计算方法),枚举没有存储...

网友评论

      本文标题:Swift之计算属性和存储属性

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