相比 Objective-C 中的 set 和 get 方法 钞脂,swift 中的set 和 get? 要復(fù)雜一點(diǎn)揣云。 在swift 中主要分存儲型屬性 和? 計(jì)算型屬性 這兩種 ,?一般 我們只是給計(jì)算屬性添加 get set? 重寫冰啃。?
DEMO下載 地址 :https://gitee.com/DeLongYang/iOSFundation?下的 setterAndGetter 工程邓夕。
打開?SetterAndGetterTests.swift 文件肋层。進(jìn)行?單元測試? 。我們主要分幾個(gè)不同的方面來進(jìn)行測試
?1.0? ??
僅僅想獲取 原來的值 其實(shí)意義不大? OC? 中的明顯的區(qū)別是?
swift 中我們 不能使用? _c 來表示 OC 中@property 修飾的變量值 翎迁。直接調(diào)用
? ? var c:Int{
? ? ? ? get{
? ? ? ? ? ? // 這里 不論是 c 還是 self.c 都會造成 crash? 原因是方法的死循環(huán)
? ? ? ? ? ? // 而且 不能像 OC 中 寫上 _c
? ? ? ? ? ? return 1
? ? ? ? ? //? ?return self.c??不論是 c 還是 self.c 都會造成 crash? 原因是方法的死循環(huán)
? ? ? ? ? //? return c?不論是 c 還是 self.c 都會造成 crash? 原因是方法的死循環(huán)
? ? ? ? }
? ? ? ? set{
? ? ? ? ? ? // 我們測試 寫上 self.c = newValue 和 不寫 都會造成 crash
? ? ? ? ? ? // 而且 不能像 OC 中 寫上 _c
? ? ? ? ? ? //? c? = newValue??造成 crash? 原因是方法的死循環(huán)
? ? ? ? ? ? a= newValue
? ? ? ? ? ? print("Recived new value", newValue, " and stored into 'A' ")
? ? ? ? }
? ? }
2.0? 由于上面提到的原因? 重寫的時(shí)候 我們使用 額外的一個(gè)變量來重寫
// 使用了 外部的一個(gè)變量來重寫了這個(gè) 方法
? ? var _tittle:String?
? ? var tittle:String?{
? ? ? ? set{
? ? ? ? ? ? _tittle=newValue
? ? ? ? }
? ? ? ? get{
? ? ? ? ? ? return_tittle
? ? ? ? }
? ? }
3.0? ?如果只重寫 get 方法,默認(rèn)為 readOnly
? ? var age:Int?{
? ? ? ? return20
? ? }
如果對? age 賦值 會造成 IDE 報(bào)錯?
4.0?存儲屬性: 就是存儲一個(gè)變量 或 常量? 懶加載也屬于存儲型屬性 類似于OC中的方法
?let aaa ="aaa"
? ? lazy var ccc:[TestModel] = {
? ? ? ? lettestModel =TestModel()
? ? ? ? vararr = [TestModel]()
? ? ? ? for_in0...99{
? ? ? ? ? ? arr.append(testModel)
? ? ? ? }
? ? ? ? //
? ? ? ? return arr
? ? }()
5.0???swift 中使用了willset 和 didSet 這連個(gè)特性 來見識屬性的除初始化之外的 屬性值變化
?和 OC 比較栋猖,我們可以在didSet 里面執(zhí)行一些改變UI的操作
?var newAge:String?{
? ? ? ? willSet{
? ? ? ? ? ? //
? ? ? ? ? ? print("===========")
? ? ? ? }
? ? ? ? didSet{
? ? ? ? ? ? print("did set "+newAge!)
? ? ? ? }
? ? }