美文网首页
swift 属性

swift 属性

作者: 奋斗的小马达 | 来源:发表于2021-12-21 17:40 被阅读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
    

    相关文章

      网友评论

          本文标题:swift 属性

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