zoukankan      html  css  js  c++  java
  • swift之属性

    知识点总结:

    1、存储属性

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

    2、惰性存储属性

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

    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
            }
            
        }()
    }

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

    3、计算属性

    只读计算属性

    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
            }
        }
        
    }

    4、属性观察者

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

    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)")
            }
        }
    }

    5、类型属性

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

  • 相关阅读:
    [LeetCode] Sqrt(x)
    [LeetCode] Rotate Array
    【经典算法】贪心算法
    【经典算法——查找】二分查找
    ARP(Adress Resolution Protocol): 地址解析协议
    【经典算法】分治策略
    [LeetCode] Recover Binary Search Tree
    [LeetCode] Convert Sorted Array to Binary Search Tree
    python数据类型之字典(dict)和其常用方法
    简单了解hash
  • 原文地址:https://www.cnblogs.com/yongbufangqi1988/p/8435933.html
Copyright © 2011-2022 走看看