Swift

Swift - Properties

2018-10-23  本文已影响15人  ienos

Support

Classes / Structures / Enumerations

懒加载 -- 初始化值直到第一被使用之前都没有计算

class DataImporter {
    var filename = "data.txt"
}

class DataManager {
    // importer 只有第一次使用的时候才会初始化
    // 多线程同时访问,将可能不只初始化一次
    lazy var importer = DataImporter()
    var data = [String]()
}

存储属性 & 实例变量

计算属性

没有存储值,提供一个 getter 和一个可选 setter

struct Size {
    var width = 0.0, height = 0.0
}

struct Point {
    var x = 0.0, y = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()
    // 计算属性,不需要存储一个 center 的值
    var center: Point { 
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.x + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        // 如果没有设置一个新值默认是 newValue
        set (newCenter) { 
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

// 只读计算属性
struct Cuboid {
    var width = 0.0, height = 0.0, depth = 0.0
    var volume: Double {
        return width * height * depth
    }
}

属性观察者 -- willSet / didSet

参数使用
调用场景

全局变量 & 局部变量

类型属性

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    // 如果需要子类能够重写,在前面加 class 关键字
    static var computedTypeProperty: Int { 
        return 1
    }
}

// 访问
SomeStructure.storedTypeProperty
struct AudioChannel {
    static let thresholdLevel = 10
    // 所有 AudioChannel 实例共享这个变量
    static var maxInputLevelForAllChannels = 0
    var currentLevel: Int = 0 {
        didSet {
           if currentLevel > AudioChannel.thresholdLevel {
              // 这里不会再调用观察者 set
              currentLevel = AudioChannel.thresholdLevel
           }
           if currentLevel > AudioChannel.maxInputLevelForAllChannels {
              AudioChannel.maxInputLevelForAllChannels = currentLevel
           }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读