Swift 只读、观察者、全局、类属性

  • 只读计算属性
struct Person {
    var firstName = "Moo"
    var lastName = "Shroom"
    var name: String {
        return firstName + lastName
    }
}
let moo = Person()
//moo.name = "123"   error: only-read
print("His name is \(moo.name)")
// His name is MooShroom
  • 属性观察者
// willset 会在该值被存储之前被调用
// didset 会在新值被存储后被调用
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}

let stepCount = StepCounter()
stepCount.totalSteps = 200
stepCount.totalSteps = 300
stepCount.totalSteps = 400
// About to set totalSteps to 200
// Added 200 steps
// About to set totalSteps to 300
// Added 100 steps
// About to set totalSteps to 400
// Added 100 steps
  • 全局变量
// 同样拥有 willSet 和 didSet
var name: String = "" {
    willSet {
        print("new " + newValue)
    }
    didSet {
        print("old " + oldValue)
    }
}

name = "1"
name = "2"
/*
new 1
old 
new 2
old 1
*/
  • 类型属性
// 对于struct、enum 我们使用static来设置类型属性
// 对于class 我们使用static或者class来设置类型属性,class关键字允许子类重写父类的实现
struct SomeStructure {
    static var storedTypeProperty = "some value"
    static var computedTypeProperty: Int {
        return 1
    }
}
enum SomEnumeration {
    static var storedTypeProperty = "some value"
    static var computedTypeProperty: Int {
        return 3
    }
}
class SomeClass {
    static var storedTypeProperty = "some value"
    static var computedTypeProperty: Int {
        return 7
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}
class SubSomeClass: SomeClass {
    class override var overrideableComputedTypeProperty: Int {
        return 108
    }
}
print(SomeClass.overrideableComputedTypeProperty)
print(SubSomeClass.overrideableComputedTypeProperty)
// 107
// 108

你可能感兴趣的:(Swift 只读、观察者、全局、类属性)