屬性
Swift中的屬性分為存儲屬性(sorted variable)和計算型屬性(computed variable)
存儲型屬性就是一般意義上理解的可以進行賦值和取值的變量。
var title = "學科"
計算型屬性,字面意思為計算型的屬性,這種屬性沒法存儲值
計算型屬性
特征:僅有get(readOnly語義)或有get+set的屬性是計算型屬性,有get+set的屬性僅作為其他屬性的外部接口
-
計算型屬性本身不占用內(nèi)存內(nèi)控昆著,所以不能賦值
get+set為計算型屬性的原因:
真正賦值的過程是存在于set方法中并被底層包裝掉的,如果我們手動實現(xiàn)了set方法糖埋,就無法進行正確的賦值
get+set正確的使用方法:作為其他屬性的外部接口
private var _squre: Double = 0.0
var squre: Double {
get {
return _squre
}
set {
if (newValue <= 0) {
print("newValue = \(newValue)")
} else {
_squre = newValue
}
}
}
存儲型屬性
ps:初始化方法生成對象宣吱,并不會出發(fā)屬性的willSet didSet方法若想再初始化階段觸發(fā)didSet,可以采用KVC的方式給對象初始化
willSet能獲取將要賦給屬性的值newValue
- 操作的屬性是對舊值操作瞳别,會被之后的內(nèi)部set覆蓋掉
- 作用:觀察
didSet能獲取屬性之前的舊值oldValue征候,新值即為屬性 - 操作屬性是對新值進行操作
- 作用:觀察杭攻、數(shù)據(jù)加工
- 當使用了didSet就不能再使用set了,因為didSet中已經(jīng)包含了set狀態(tài)
class TestCard {
init(width: Double) {
self.width = width
}
var width: Double {
willSet {
print("willSet方法被調(diào)用")
print("在willSet中疤坝,width = \(width),newValue = \(newValue)")
}
didSet {
print("didSet方法被調(diào)用")
print("在didSet中兆解,width = \(width),oldValue = \(oldValue)")
}
}
}
初始化方法生成對象,并不會觸發(fā)屬性的willSet didSet方法
// 初始化方法 不會觸發(fā) willSet didSet
let card = TestCard.init(width: 10.0)
改用KVC的方式給對象初始化跑揉,就可以調(diào)用didSet了:
- 修改:繼承NSObject重新構(gòu)造函數(shù)锅睛、屬性前加@objc、屬性變?yōu)楸剡x類型并給默認值历谍。 setValue(width, forKey: "width")
class TestCard: NSObject {
init(width: Double) {
super.init()
setValue(width, forKey: "width")
}
@objc var width: Double = 0.0 {
willSet {
print("willSet方法被調(diào)用")
print("在willSet中现拒,width = \(width),newValue = \(newValue)")
}
didSet {
print("didSet方法被調(diào)用")
print("在didSet中,width = \(width),oldValue = \(oldValue)")
}
}
}
計算型屬性與懶加載
計算型屬性:只是為了調(diào)用其他屬性而包裝的讀取方法
//計算型屬性:只是為了調(diào)用其他屬性而包裝的讀取方法
var title: String? {
get {
return "所選學課:" + "\(name)"
}
}
- 不分配獨立的存儲空間
- 每次調(diào)用時都會被執(zhí)行
懶加載
- 在第一次調(diào)用時望侈,執(zhí)行閉包并且分配空間存儲閉包返回的內(nèi)容
- 會分配獨立的存儲空間
- 與OC不同的是lazy屬性即使被設置為nil也不會被再次調(diào)用
lazy var title: String = {
return "所選學課:" + "(name)"
}()