標籤:swift ios 語言 蘋果 屬性
從這篇章節起,Swift程式設計語言指南大部分的重要內容在於概念,代碼並不是太多。理解Swift的物件導向理念,文法以及類結構,構造析構過程對於很好的應用Swift語言將會有比較大的協助。
屬性
儲存屬性儲存區屬性通常是那些可以通過直接賦值,或者直接存取成員能夠獲得的屬性類型。它有些要注意的地方:若一個結構體被聲明為常量,則子屬性無法被修改了。在Objective-C中,我們總是無法修改結構體的子屬性,但是swift卻可以,不過這種情況是個例外,當你儲存型屬性是個結構體並且是個常量,那你就不要再試圖去修改這個結構體的子屬性了。而類屬於參考型別,即使聲明為常量我們也可以修改。
消極式載入儲存屬性消極式載入我們又稱為懶載入,在Swift中提供了一個@lazy用於聲明懶載入的屬性.@lazy修飾的屬性必須為變數,因為通常常量屬性我們必須在構造完成前賦值,基於這一特性,無法對常量進行懶載入。
這裡我們在調用其函數時才對dataList進行訪問,而訪問的時候再根據它是否建立過進行是否載入的決定。
計算屬性計算型屬性通常不直接儲存值,通過getter來擷取值,setter來間接設定其他屬性或者變數的值。
結構體rect中,中點center就是通過對自己原點和尺寸資料的計算得來的。而area變數則是只聲明了get方法,我們預設其為唯讀計算型屬性。其實我們唯讀計算型屬性也可以省略掉get{}
var area: Double {returnsize.width *size.height }
屬性監視器
在Objective-C中,我們有KVO機制來靈活的監視屬性變化,在Swift則用屬性監視器來實現。willSet{} 設定新值前系統回調,若不指名參數名稱,則新值用newValue表示didSet{} 設定完成後系統回調,若不指名,提供之前值oldValue。
簡單的計步器類,在設值前後進行了控制台的輸出。注意這裡用到了單例,不過貌似蘋果目前還沒有關於Swift的單例實踐的推薦方式。
注意這裡shared變數使用了class關鍵字進行修飾,而結構體Inner中的變數使用了static修飾。這兩者分別在類或者值類型中表示類型屬性,所有執行個體共用這一屬性。
方法
同Ojbective-C相似,Swift也有類方法和執行個體方法,使用也很簡單,執行個體直接聲明func即可,類則需要用class修飾。但是有時我們更喜歡稱它為函數。
變異(mutating)一般情況下,值類型的屬性不能在它的執行個體方法中進行修改,引用也一樣,如果要修改需要在方法前用mutating關鍵字進行修飾。
這裡這個函數我們需要對剛才定義過的點結構體進行擴充,擴充中修改了其屬性,所以需要將函數加mutating修飾。
在變異方法中我們同樣可以給self賦值。
一個簡單的枚舉,在next()函數中完成了對self的切換。
類方法
上面提到過,類方法值類型如結構體使用static,而參考型別,例如類則使用class。
這裡使用類方法完成了一個簡單的Factory 方法,其實在Swift中,若是簡單的對屬性賦值,我們可以使用便捷(自訂)構造器來完成,這點以後寫到構造器時會講到。另外如果我們在沒有執行個體時,例如在類方法中,使用了self,則self指向這個類型而不是執行個體。例如Objective-C中的[[self alloc] init]寫法。
下標指令碼(subscripts)
這個概念在Objective-C中並沒有,我們說Swift文法比較靈活和強大,在於它對結構體,枚舉,函數的強大功能進行了擴充和支援,例如函數在Swift中屬於First-Class層級。
在這裡,下標指令碼通常可以用於定義在類,結構體和枚舉中,我們可以自訂快捷的訪問方式通過使用下標指令碼。對於同一個目標我們可以通過對其函數重載的方式定義多重方式的下標指令碼訪問。
基本文法和使用:
定義了一個三倍計算結構體常量,然後傳入索引並擷取指令碼計算得到的值。
不過需要注意的是,下標指令碼參數不允許設定預設值,不允許使用inout對參數進行修改。一個簡單的例子:
這裡我們通過下標能快速的訪問這個類執行個體持有的資料列表相應位置上的值,而不需要在訪問時每次都要寫一次訪問其持有的數組在訪問相應的obj。
繼承
在Swift中,繼承是區分”類”和其它類型的一個基本特徵。
基類
不同於OC中的NSObject,Swift中的類並不是從一個通用的基類繼承而來的。但是很多功能Swift通過提供標準庫來實現。
子類產生
直接通過 ":"來標識繼承關係。子類試圖修改那些繼承來的屬性時需要先對他們進行初始化。
重寫
使用override關鍵字
在重寫屬性時,必須將名字和類型全寫出來,才能使編譯器去檢查你重寫的屬性是否與超類匹配。你可以將唯讀屬性重寫為可讀寫,但是不能將可讀寫(readwrite)重寫為唯讀(readonly)。
另外我們可以重寫屬性觀察器,但不可以為唯讀屬性及已有setter的屬性重寫觀察器。
同JAVA一樣,若防止重寫則用@final聲明為最終版本。
以上就是本篇部落格的全部內容,歡迎聯絡本人進行討論和勘誤。