窺探Swift之別具一格的Struct和Class

  說到結構體和類,仍是那句話,只要是接觸過編程的小夥伴們對這二者並不陌生。但在Swift中的Struct和Class也有着使人眼前一亮的特性。Struct的功能變得更爲強大,Class變的更爲靈活。Struct中不只能夠定義屬性,而且還能夠在其中定義函數,這一點比較像Class的特性了。不過Struct畢竟是結構體,它仍是不支持繼承等類特有的屬性的。今天這篇博客就正兒八經的來搞一搞Swift中的Struct和Class。html

  固然,這篇博客是比較基礎的,可是基礎的東西纔是重要的東西呢,廢話很少說了,走起。編程

 

  一. Struct (結構體)編程語言

    結構體,說白了就是一組變量,這些變量有統一的命名。在Swift中,咱們不只能夠在Struct中聲明變量併爲變量設置默認值,並且能夠在Struct中添加相應的函數。接下來咱們就要建立一個Point結構體,裏邊有兩個屬性x座標和y座標,而且x座標和y座標的初始值爲0。其中還有兩個方法,一個是display方法,負責輸出點的座標,而且還有一個setPoint方法,這個方法負責設置座標點。而後咱們就要去這個結構體去聲明變量,而且調用其中的方法。函數

 

    1.結構體類型的定義post

     使用struct關鍵字來聲明咱們的結構體類型,結構體類型的名稱爲MyPoint, 其中座標x, y爲變量,其初始值爲0。而且爲咱們的結構體添加了一個setMyPoint()方法和display()方法。url

    由上面的代碼片斷你也許會注意到在setMyPoint()方法關鍵字func前邊多了一個mutating關鍵字。在Struct中的函數,默認(不添加mutating關鍵字)的函數對Struct中屬性只有只讀權限。若是你添加上mutating, 那麼該函數就對屬性持有讀寫的權限。spa

 

    2.結構體類型變量的聲明以及結構體函數的使用3d

    接下來咱們就利用上述「MyPoint」結構體類型來建立一個結構體類型變量。由於(x, y)值是有初始值的,因此在初始化結構體變量時不須要爲其指定初始值。Struct類型的使用和Class使用是大同小異的。MyPoint()就相似於類的構造函數。咱們聲明完變量,並分配內存空間後,咱們對x, y的值進行打印能夠看到x, y的初始值爲0。具體以下所示:htm

 

    咱們能夠調用訪問權限爲讀寫的setMyPoint()方法來改變結構體變量中屬性的值,下方就是把座標(10.0,20.0)賦值給myPoint變量,具體以下所示。對象

 

    除了上述方法給結構體變量中的屬性賦值外,咱們還能夠經過構造函數給其屬性賦值。也就是在給變量分配內存空間時爲其指定初始值,這一點就和類的構造函數即爲類似了。具體方式以下圖片中的代碼片斷所示:    

    結構體就先聊到這兒,下面開始比較重要的部分:類(Class)

 

 

  

  二. 類(Class)

    Swift做爲一門現代面向對象編程語言,怎麼能沒有類呢。關於Objc中的Class, 請參考我以前發表的一篇博客《在Objective-C中淺談面向對象》, 其中淺談了Objective-C中面向對象的東西。今天就聊聊Swift中的類,雖然語言不通,可是Class仍是大同小異的。本篇博客的此部分注重Swift類中的語法已經使用方式,對面向對象的思想沒有作過多的陳述,由於咱們的重點是在Swift編程,而不是面向對象編程。好~進入這一部分的主題。

 

    1. 類的建立與構造器

    爲了簡單也是秉着由淺入深的原則,接下來將把上面MyPoint結構體類型使用類的形式來實現一下。簡單從語法上看二者是大同小異的。下方截圖中的代碼段是在上述MyPoint結構體修改而來的。改爲下方MyPoint類作了兩點修改,第一點就是把struct關鍵字改爲class關鍵字,

 

    下方是MyPoint類的使用方法,雖然在上述類中沒有構造函數,會自動生成一個默認的無參構造函數。以下所示,調用的就是默認的無參構造函數進行的類的實例化。由於在類定義時咱們爲類中的屬性(即類的特徵)指定了初始值,因此將值進行打印就會顯示初始值了。

 

    你在類定義時,沒有爲其定義其餘的構造函數,若是你調用了該未定義的構造函數,那麼就是你的不對了,編譯器就會報錯了,以下所示:

 

    接下來咱們就要爲咱們的MyPoint()類建立構造函數了。與其餘現代編程語言(如C++, C#,Java等)不一樣,Swift的構造函數不是與類名同名的函數,而是使用特定的函數名init()來建立其構造函數。下方就是咱們MyPoint類的構造函數,函數名固然是init了。在構造函數的形參列表中,咱們能夠爲形參指定默認值,雖然下方只是一個構造函數,可是該構造函數與他的形參列表中的默認值一組合起來,可謂是打了一個漂亮的組合拳,使用起來也是灰常順手的。

 

    給構造函數的形參列表指定默認值就省去了重載構造函數的麻煩。上面添加了一個構造函數,併爲各個形參指定默認值,下方是其不一樣的調用方式,這在C++中應該重載4個構造函數才能實現的效果。Swift語言因而可知一斑呢~爲之又眼前一亮,心中爲之一振呢。具體調用方式以下:

 

 

 

    2.對象的賦值與比較

    在Swift中也是容許把一個類的變量的值經過賦值運算符(=)來賦值給另外一個變量的。不過有一點要搞明白,若是類變量a的值賦值被類變量b,那麼變量a和b就指向同一塊內存區域。若是a中的實例變量中的值進行了修改,那麼實例b中的值也會進行修改。爲了更好的表達這個思想,咱們仍是來張原理圖來介紹一下對象的賦值吧。具體的原理圖以下所示:

    上面是原理,下方就是驗證。咱們就聲明兩個變量a, b。 給a分配一個實例的空間,而後把a賦值給b。再接着就是改變a的值,觀察b中的屬性變化。具體以下所示:

    若是要判斷兩個變量是否指向同一個實例,那麼咱們就須要使用恆等運算符(===)了。下方就是判斷a是否和b指向同一個內存空間,具體代碼以下所示:

 

 

 

 

    3.屬性的懶加載(lazy)

    在Swift的類中在對類進行初始化時,要對一些屬性進行初始化。若是某些屬性的初始化若是很是的耗費時間,那麼在這種狀況下咱們就能夠該初始化耗時的屬性聲明爲懶加載的屬性。就是在該屬性聲明的時候加上lazy關鍵字。被Lazy關鍵字修飾的變量會在使用時纔會進行空間的分配。下方就是一個lazy的實例。

    在下方實例中,除了MyPoint類,咱們還須要定義一個MyCycle類。在MyCycle類中,使用到MyPoint類。在MyCycle類中的MyPoint屬性爲懶加載屬性,具體請看代碼,以下所示:

      (1) 定義MyCycle類,在MyCycle類中,定義一個屬性爲lazy的MyPoint類變量。以下所示:

 

      (2)接下來就是使用MyCycle, 聲明MyCycle類型的變量,併爲其分配MyCycle的類型實例。由下方實例可知,在調用MyCycle()構造函數時,MyCycle類中的point屬性並無對其進行初始化,此刻的point爲nil。這樣就減小了MyCycle初始化的時間。

 

      (3) lazy屬性point會在MyCycle實例對象在使用point屬性時纔會對其進行初始化,下方是myCycle實例變量調用point屬性的代碼片斷,這時就明確的看到point是不爲nil的。以下所示:

 

 

    4. 計算屬性(Count Property)

    計算屬性這一個特性在Objective-C中也是沒有的。什麼是計算屬性呢,一句話歸納:計算屬性的值能夠由其餘屬性的值來計算獲得,同時在給計算屬性賦值時也能夠用來計算其餘屬性的值。也許提及來比較拗口,理解起來也許回有些困難,那麼接下來來個小實例便可明白計算屬性是怎麼回事了。

    下方咱們建立一個名爲Money的類,在Money類中有兩個屬性,一個是存儲屬性(普通屬性)名爲CNY(表明着人民幣), 另外一個是名爲USD的計算屬性(表明美圓)。在USD計算屬性的set方法中由USD的值計算CNY的值,在USD計算屬性的get方法中由CNY計算出USD的值,並返回。Money類的具體代碼片斷以下所示:

 

    計算屬性在使用時和存儲屬性沒有什麼區別,下方是Money實例來調用其存儲屬性和計算屬性的代碼段,已經結果輸出以下所示。下方代碼段雖然簡單,可是你慢慢的去品仍是頗有味道的。先看第一部分,也就是第一次給USD賦值,當給USD賦值時,CNY的之會當即被計算出來。 而當咱們給CNY賦值時,USD的值不會被當即計算出來,由於只有在使用USD時纔會調用get方法,這時候纔會根據CNY的值來計算USD的值。具體結果請看下方代碼段: 

 

    

    5. 屬性觀察

      屬性觀察是用來幹嗎的呢?說白了,屬性觀測器就是來觀察屬性的賦值狀況的,屬性觀測器包括willSet()和didSet , willSet在屬性將要被賦值的時候被調用, didSet是在屬性被賦值後調用,關於這兩個屬性觀察函數,寫個實例就一目瞭然了。由下方實例可知,在willSet調用時,property屬性的值還爲默認值,可是在didSet執行時,property的值已經成爲被賦予的值了。

 

    6. 實例方法與類方法

      在Objc中,類方法是由+來修飾的,實例方法是由-號來修飾的。在Swift的方法中就沒有+或者-號進行修飾了,可是Swift中聲明方法時,多了一個class。普通方法沒有什麼特別之處,而類方法的聲明和定義須要在關鍵字func前添加class關鍵字。下方MyTestClass中定義了一個實例方法和一個類方法,而且給出了調用方式,以下所示:

 

 

    今天博客的內容就先到這兒,下篇博客會涉及一些類的繼承和類中的方法和屬性的訪問權限等其餘一些關於類的東西。

相關文章
相關標籤/搜索