swift之属性

知识点总结:安全

一、存储属性闭包

struct Town{
    let region = "South" //只读属性
    var population = 5422 //读写属性
}

二、惰性存储属性spa

对于属性来讲,惰性加载意味着属性的值只在第一次访问的时候才会出现,所以lazy属性必须声明为var。注意:标记为lazy的属性只会被计算一次。code

struct Town{
    let region = "South" //只读属性
    var population = 5422 //读写属性
    
    enum Size {
        case small
        case middle
        case large
    }
    
    lazy var townSize:Size = {
        switch self.population {
        case 0...10000:
            return Size.small
        case 10001...100000:
            return Size.middle
        default:
            return Size.large
        }
        
    }()
}

解释两点:一、self.population中self重要性:这个闭包必须引用self才能在闭包内访问到这个实例的population属性;二、这个地方为何要用惰性属性:为了让闭包能安全地访问self,编译器必须知道self已经初始化完成了。把townSize标记为lazy是告诉编译器这个属性不是建立self所必须的;若是它不存在,就应该在它第一次被访问的时候建立。这就告诉编译器:当闭包被调用时,self确定已经可用了。blog

三、计算属性继承

只读计算属性get

struct Town{
    var population = 2300
}

class Monster{
    var name = "Monster"
    var town:Town?
    var victimPool:Int{
        get{
            return town?.population ?? 0
        }
    }
    
}

可读写计算属性编译器

struct Town{
    var population = 2300
}

class Monster{
    var name = "Monster"
    var town:Town?
    var victimPool:Int{
        get{
            return town?.population ?? 0
        }
        set{
            town?.population = newValue
        }
    }
    
}

四、属性观察者it

属性观察者对于任何自定义的存储属性和任何继承的属性均可用。自定义的计算属性不能用属性观察io

struct Town{
    var population = 2300 {
        willSet{
            print("The population will change from \(population) to \(newValue)")
        }
        didSet{
            print("The population has changed from \(oldValue) to \(population)")
        }
    }
}

五、类型属性

类型属性对于类型是通用的,他们的值在同类型实例间共享的。值类型(结构体和枚举)既能够有存储类型属性、也能够有计算类型属性,值类型的类型属性以关键字static开头。类也能够有存储类型属性和计算类型属性,语法上若是用static,则子类不能覆盖父类的类属性,若是用class关键字,子类能为某个类属性提供本身的实现。

相关文章
相关标签/搜索