swift 属性

属性种类

swift属性分为两种
1、存储属性
注意⚠️:
类似与成员变量这个概念
存储在实例的内存中(堆空间)
结构体、类可以定义存储属性 (枚举是不可以定义存储属性的)

struct Point {
    var x:Int
    var y:Int
}

// x 和 y 就是存储属性

2、计算属性
注意⚠️:
计算属性的本质是方法(函数)
不占用实例对象的内存
定义计算属性只能使用var 不能使用let
因为:let 代表常量 值是一成不变的, 计算属性的值可能发生变化(即使是只读计算属性)

struct Circle {
    var radius:Double
    var diamater:Double{
        set{
            radius = newValue
        }
        get{
            radius*2
        }
    }
}

// diamater 就是计算属性

//如果有 set 和 get 方法 证明这个计算属性 是可读可写的计算属性
//如果 只有get方法 则证明这个计算属性是只读属性

延迟存储属性

使用lazy 可以定义一个延迟存储属性 在第一次用到属性的时候才会进行初始化

注意⚠️:
延迟存储属性必须是var 不能是let
因为:swift 有严格的规定 let必须在实例的初始化方法完成之前就拥有值

如果多条线程同时第一次访问 Lazy属性 就无法保证属性只会初始化一次

当结构体包含一个延迟存储属性时,只有var才能访问延迟存储属(如下图)
因为延迟属性初始化时需要改变结构体的内存(类可以)


截屏2021-12-21 下午5.24.46.png

这个p不能使用let 只能使用var

struct Point {
    var x:Int
    var y:Int
    lazy var z:Int = 0
}
//这个 z 就是延迟存储属性

属性观察器

可以为非lazy的var存储属性设置属性观察器(类似KVO)


struct Circle {
    var radius: Double {
        willSet {
            print("willSet", newValue)
        }
        
        didSet {
            print("didSet", oldValue, radius) }
        
    }
    
    init() {
        self.radius = 1.0
        print("Circle init!") }
    
}
var circle = Circle()
// willSet 10.5
// didSet 1.0 10.5
circle.radius = 10.5

//willSet会传递新值,默认叫newValue
//didSet会传递旧值,默认叫oldValue
//在初始化器中设置属性值不会触发willSet和didSet
//在属性定义时设置初始值也不会触发willSet和didSet
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 属性分类在Swift中, 严格意义上来讲属性可以分为两大类: 实例属性和类型属性 实例属性(Instance Pr...
    1980_4b74阅读 454评论 0 0
  • 原文博客地址: 浅谈Swift的属性(Property) 今年期待已久的Swift5.0稳定版就已经发布了, 感兴...
    TitanCoder阅读 1,755评论 0 6
  • 属性 一: 存储属性 存储属性类似于成员变量,定义方式很简单: 存储属性(Stored Property) 类似于...
    蒋斌文阅读 469评论 0 1
  • 先看总结:枚举、结构体、类都能定义⽅法、计算属性、下标(包括实例的、类的),计算属性和下标的本质还是方法。 枚举、...
    Imkata阅读 581评论 3 0
  • Swift中跟实例相关的属性可以分为2类 存储属性(Stored Property)类似于成员变量存储在实例的内存...
    Aliv丶Zz阅读 401评论 0 0