swift 属性

2021-12-21  本文已影响0人  奋斗的小马达

属性种类

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
上一篇下一篇

猜你喜欢

热点阅读