標籤:
從這篇章節起,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變數使用了classkeyword進行修飾,而結構體Inner中的變數使用了static修飾。這兩者分別在類或者值類型中表示類型屬性,全部執行個體共用這一屬性。
方法
同Ojbective-C相似,Swift也有類方法和執行個體方法,使用也非常easy,執行個體直接聲明func就可以,類則須要用class修飾。可是有時我們更喜歡稱它為函數。
變異(mutating)普通情況下,值類型的屬性不能在它的執行個體方法中進行改動,引用也一樣,假設要改動須要在方法前用mutatingkeyword進行修飾。
這裡這個函數我們須要對剛才定義過的點結構體進行擴充,擴充中改動了其屬性,所以須要將函數加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通過提供標準庫來實現。
子類產生
直接通過 ":"來標識繼承關係。子類試圖改動那些繼承來的屬性時須要先對他們進行初始化。
重寫
使用overridekeyword
在重寫屬性時,必須將名字和類型全寫出來,才幹使編譯器去檢查你重寫的屬性是否與超類匹配。你能夠將僅僅讀屬性重寫為可讀寫,可是不能將可讀寫(readwrite)重寫為僅僅讀(readonly)。
另外我們能夠重寫屬性觀察器,但不能夠為僅僅讀屬性及已有setter的屬性重寫觀察器。
同JAVA一樣,若防止重寫則用@final聲明為終於版本號碼。
以上就是本篇部落格的所有內容,歡迎聯絡本人進行討論和勘誤。
Swift的屬性,方法,下標指令碼以及繼承