属性

作者: 张_何 | 来源:发表于2018-08-23 14:31 被阅读0次

    存储属性

    • 简单来说,一个存储属性就是存储在特定类或结构体实例里的一个常量或变量。存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字 let 定义)。
    struct FixedLengthRange {
        var firstValue: Int
        let length: Int
    }
    var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
    rangeOfThreeItems.firstValue = 6
    rangeOfThreeItems.length = 4  // 编译器报错,因为length不能被修改
    
    • 如果创建了一个结构体的实例并将其赋值给一个常量,则无法修改该实例的任何属性,
      这种行为是由于结构体(struct)属于值类型。当值类型的实例被声明为常量的时候,它的所有属性也就成了常量。
      属于引用类型的类(class)则不一样。把一个引用类型的实例赋给一个常量后,仍然可以修改该实例的变量属性。
    let rangOfTwoItems = FixedLengthRange(firstValue: 0, length: 2)
    rangOfTwoItems.firstValue = 2 //编译器会报错,因为rangOfTwoItems是一个常量
    

    计算属性

    • 除存储属性外,类、结构体和枚举可以定义计算属性。计算属性不直接存储值,而是提供一个 get 和一个可选的 set,来间接获取和设置其他属性或变量的值。
    class personal {
        var totalSteps: Int {  // 注意这里如果重写了set 或者 get 方法 ,就不能指定默认值了
            set{  //如果计算属性的 setter 没有定义表示新值的参数名,则可以使用默认名称 newValue
               totalSteps > newValue
            }
            get {
                return 2
            }
        }
    }
    

    属性观察器

    • 属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,即使新值和当前值相同的时候也不例外。
      可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重写属性的方式为继承的属性(包括存储属性和计算属性)添加属性观察器。你不必为非重写的计算属性添加属性观察器,因为可以通过它的 setter 直接监控和响应值的变化。

      • willSet 在新的值被设置之前调用
      • didSet 在新的值被设置之后立即调用
    • willSet 观察器会将新的属性值作为常量参数传入,在 willSet 的实现代码中可以为这个参数指定一个名称,如果不指定则参数仍然可用,这时使用默认名称 newValue 表示。

    • 同样,didSet 观察器会将旧的属性值作为参数传入,可以为该参数命名或者使用默认参数名 oldValue。如果在 didSet 方法中再次对该属性赋值,那么新值会覆盖旧的值。

    class personal {
        var totalSteps: Int = 0 {
            willSet {
                print(newValue)
            }
            didSet {
                if totalSteps > oldValue {
                    print(oldValue)
                }
            }
        }
    }
    
    

    类型属性

    • 使用关键字 static 来定义类型属性。在为类定义计算型类型属性时,可以改用关键字 class 来支持子类对父类的实现进行重写。下面的例子演示了存储型和计算型类型属性的语法:
    struct SomeStructure {
        static var storedTypeProperty = "Some value."
        static var computedTypeProperty: Int {
            return 1
        }
    }
    enum SomeEnumeration {
        static var storedTypeProperty = "Some value."
        static var computedTypeProperty: Int {
            return 6
        }
    }
    class SomeClass {
        static var storedTypeProperty = "Some value."
        static var computedTypeProperty: Int {
            return 27
        }
        class var overrideableComputedTypeProperty: Int {
            return 107
        }
    }
    

    获取和设置类型属性的值

    类型属性是通过类型本身来访问,而不是通过实例。比如:
    print(SomeStructure.storedTypeProperty)
    SomeStructure.storedTypeProperty = "Another value."

    相关文章

      网友评论

          本文标题:属性

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