iOS 开发中属性是一种常用方式,在Swift中属性到底如何声明,如何延时加载(懒加载) 如何监听属性值的变化。
属性类型
Swift 中主要存在两种属性类型,存储属性
和计算属性
,属性可以在类
,结构体
,枚举
中存在,值得注意的是存储属性只能存在于类
和结构体
属性与特定类型的实例相关,但是也存在类型属性(作用于属性本身)。
存储属性
存在于类
或结构体
的常量(let)和变量(var)。
延时加载
为节约空间和时间成本,我们应该避免过度初始化某些属性。lazy 对属性就行修饰。
注意:
必须将延迟属性声明称变量(var),因为属性的初始值可能在实例构造完成之后才会得到。
而常量属性在构造完成之前必须要有初始值
class DataImporter {
var filename = "data.txt"
}
class DataManager {
lazy var importer = DataImporter()
var data = [String]()
}
let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
计算属性
计算属性不直接存储值,而是提供了一个getter
和 一个可选的setter
, 来简洁获取和设置其它属性或变量的值。
属性观察
属性观察是swift 一个很特殊的特性,swift 为我们提供了两个属性观察的方法,willSet
, didSet
。
Swift 提供了两种属性类型,上述在描述计算属性的时候,我们说过计算类型不包括背后的存储,只提供set
和 get
方法。在同类一类型中,属性观察和计算属性是不能同时共存的。计算属性我们可以通过改写set
中的内容来达到willSet
和 didSet
同样属性观察的目的。如果无法改动这个类,我们需要子类话这个类,
class Parent {
var calculateProp: Int {
get {
print("getter")
return 10086
} set {
print("setter")
}
}
}
class Son: Parent {
override var calculateProp: Int {
willSet {
print("willSet")
} didSet {
print("didSet")
}
}
}
let son = Son()
son.calculateProp = 10000
// get
// willSet
// set
// didSet
get
首先被调用了一次,由于didSet
调用了oldValue
属性作用域
Swift中class
和static
是用来修饰类型作用域的,在非class
类型的上下文中使用static
,值得注意是对于class
中是不能出现class
的存储属性的。
应使用static
class CustomClass {
static var customProp: XXXX
}
KVO
当我们需要对不同实例对当前的某个属性进行监听时,KVO可以帮我解决这样的需求。swift中的KVO是如何实现的呢。