- Swift 5從零到精通iOS開發訓練營
- 張益琿編著
- 1209字
- 2022-07-27 18:32:18
7.1 類與結構體的定義
在生活中,人們將擁有相似屬性和行為的事物歸為一類,生物被分為動物、植物和微生物等,動物和植物又會進一步分門別類,如鳥、獸、魚、蟲等。編程中的類也有相似的意義,一個基類可以派生出各種子類。在Swift語言中,結構體是功能僅遜于類的數據結構,其也可以描述擁有某些屬性和行為的事物,只是它的實現機制和類有著本質的區別,應用場景也有所不同。
7.1.1 結構體
在編程中,結構體是用于描述一種事物的結構。在Objective-C語言中,結構體中只可以定義屬性,而不能定義方法;而在Swift語言中,結構體和類十分相似,其中既可以定義屬性,又可以定義方法,但其不像類一樣具有繼承的特性。
在Swift語言中,使用struct關鍵字來定義結構體,結構體中可以聲明變量或者常量作為結構體的屬性,也可以創建函數作為結構體的方法,結構體使用點語法來調用其中的屬性和方法。使用Xcode開發工具創建一個名為ClassAndStruct的Playground文件,在其中編寫一個汽車的結構體,示例代碼如下:

上面的代碼中示例的結構體模擬了汽車這樣的事物,并提供了3個屬性,分別代表汽車的價格、品牌、油量,還提供了兩個方法,分別表示汽車行路與加油的行為。在創建結構體后,結構體會默認生成一個構造方法供開發者使用,開發者可以在構造方法中完成對結構體的實例化,示例代碼如下:

以上示例代碼通過結構體來模擬現實生活中的汽車,需要注意,Swift語言中的數據類型分為值類型和引用類型。結構體、枚舉以及前面讀者接觸到的除類以外的所有數據類型都屬于值類型,只有類是引用類型的。值類型數據和引用類型數據最大的區別在于當進行數據傳遞時,值類型總是被復制,而引用類型不會被復制,引用類型是通過引用計數來管理其生命周期的。關于引用計數與內存管理,后面章節會專門介紹。讀者在這里需要注意,如果值類型有數據傳遞,原來的實例會被復制一份,修改新的實例并不能修改原始的實例,以Car結構體為例:

從上面代碼的打印信息可以看出,car實例與car2實例分別獨立。
7.1.2 類
類是較結構體更加高級的一種數據類型,編程中的所有復雜數據結構都是通過類來模擬的。簡單理解,類是編程世界中萬物的抽象,使用類可以模擬萬物的對象。以射擊類游戲為例,游戲中的主角、武器、道具、敵人、子彈等都是類。
Swift語言中的類使用關鍵字class來聲明,使用類的方式模擬汽車類型,示例代碼如下:

分析上面創建ClassCar類的代碼可以發現,類與結構體創建屬性與方法的代碼基本一樣。不同的是,在結構體中開發者并不需要提供構造方法,結構體會根據屬性自動生成一個構造方法,而類則要求開發者自己提供構造方法,在init()構造方法中,需要完成對類中所有屬性的賦值操作。
創建類實例、訪問類實例屬性的方法,示例如下:

可以看出,類和結構體一樣,也是通過點語法來完成屬性方法的訪問的。和結構體不同的是,類是引用類型,對類實例進行數據傳遞時并不會產生復制行為。因此,如果將類實例傳遞給新的變量,修改新的變量會影響原始變量,示例如下:

正是由于類的這種特性,在編程中,同一個類實例可以被多處引用共享。
- Spring Boot 2實戰之旅
- DB2 V9權威指南
- Hands-On Machine Learning with scikit:learn and Scientific Python Toolkits
- Python程序設計(第3版)
- C語言程序設計教程(第2版)
- Python面向對象編程:構建游戲和GUI
- PHP+MySQL動態網站開發從入門到精通(視頻教學版)
- PHP 8從入門到精通(視頻教學版)
- Learning Image Processing with OpenCV
- WCF技術剖析(卷1)
- Ionic3與CodePush初探:支持跨平臺與熱更新的App開發技術
- Learning Redux
- Web前端開發精品課:HTML5 Canvas開發詳解
- ASP.NET 4權威指南
- 軟件測試實驗實訓指南