官术网_书友最值得收藏!

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()構造方法中,需要完成對類中所有屬性的賦值操作。

創建類實例、訪問類實例屬性的方法,示例如下:

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

正是由于類的這種特性,在編程中,同一個類實例可以被多處引用共享。

主站蜘蛛池模板: 当涂县| 吴江市| 巴东县| 琼结县| 新巴尔虎右旗| 新巴尔虎右旗| 千阳县| 永康市| 苍梧县| 巫山县| 玉龙| 烟台市| 乌兰察布市| 五台县| 皋兰县| 北流市| 光山县| 小金县| 新建县| 临桂县| 昌都县| 青河县| 扎兰屯市| 阜平县| 襄垣县| 洛扎县| 定结县| 鄂州市| 松潘县| 隆尧县| 沐川县| 泰顺县| 军事| 仙游县| 双流县| 简阳市| 博湖县| 高雄县| 靖江市| 前郭尔| 台东市|