9.類和結(jié)構(gòu)體
-
結(jié)構(gòu)體和類相比
Swift中結(jié)構(gòu)體和類的共同點: - 定義屬性?于存儲值 - 定義方法?于提供功能 - 定義下標操作?于通過下標語法訪問它們的值 - 定義構(gòu)造器器用于設(shè)置初始值 - 通過擴展以增加默認實現(xiàn)之外的功能 - 遵循協(xié)議以提供某種標準功能 與結(jié)構(gòu)體相比看峻,類還有如下的功能: - 繼承允許一個類繼承另一個類的特征 - 類型轉(zhuǎn)換允許在運行時檢查和解釋一個類實例的類型 - 析構(gòu)器允許一個類實例釋放任何其所被分配的資源 - 引用計數(shù)允許對一個類的多次引? 結(jié)構(gòu)體和類有著相似的定義方式互妓。 struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } 結(jié)構(gòu)體和類都使用構(gòu)造器語法來創(chuàng)建新的實例例坤塞。構(gòu)造器語法的最簡單形式是在結(jié)構(gòu)體或者類的類型名稱后跟隨?對空括號,如 Resolution() 或 VideoMode()摹芙。你可以通過使用點語法訪問實例的屬性。其語法規(guī)則是浮禾,實例名后?緊跟屬性名,兩者以點號 ( . )分隔盈电,不帶空格 let someResolution = Resolution() someResolution.width = 5 let someVideoMode = VideoMode() someVideoMode.resolution = someResolution //結(jié)構(gòu)體類型的成員逐一構(gòu)造器器 所有結(jié)構(gòu)體都有一個?動生成的成員逐一構(gòu)造器器,?于初始化新結(jié)構(gòu)體實例中成員的屬性熬词。與結(jié)構(gòu)體不同,類實例例沒有默認的成員逐一構(gòu)造器荡澎。 let vga = Resolution(width: 640, height: 480)
-
結(jié)構(gòu)體和枚舉是值類型
//值類型是這樣一種類型晤锹,當它被賦值給一個變量、常量或者被傳遞給一個函數(shù)的時候鞭铆,其值會被拷?。 實際上车遂,Swift 中所有的基本類型:整數(shù) (integer)、浮點數(shù)(floating-point number)舶担、布爾值(boolean)、字符串串(string)衣陶、數(shù)組 (array)和字典(dictionary)闸氮,都是值類型教沾,其底層也是使?用結(jié)構(gòu)體實現(xiàn)的。Swift 中所有的結(jié)構(gòu)體和枚舉類型都是值類型授翻。這意味著它們的實例例,以及實例例中所包含的任何 值類型的屬性堪唐,在代碼中傳遞的時候都會被復(fù)制。
-
類是引用類型
與值類型不同羔杨,引?類型在被賦予到一個變量量杨蛋、常量或者被傳遞到一個函數(shù)時,其值不會被拷貝逞力。因此,使用的是已存在實例的引?寇荧,而不是其拷貝。 因為類是引?類型揩抡,所以多個常量和變量可能在幕后同時引?一個類實例例。(對于結(jié)構(gòu)體和枚舉來說峦嗤,這并不成立。因為它們作為值類型烁设,在被賦予到常量、變量或者傳遞到函數(shù)時装黑,其值總是會被拷?。) //恒等運算符:判定兩個常量或者變量是否引用同一個類實例 相同( === ) 不相同( !== )