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是如何实现的呢。
Swift属性深入解析

本文深入探讨Swift中的属性概念,包括存储属性、计算属性及其使用场景。解析了如何使用lazy关键字实现延时加载,以及如何利用willSet和didSet观察属性变化。通过具体代码示例,展示了属性在Swift中的强大功能。
2051

被折叠的 条评论
为什么被折叠?



