//swift 中類和結構體的共同點:
//1. 定義屬性用於儲存值
//2. 定義方法用於提供功能
//3. 定義下標用於訪問值
//4. 定義構造器用於生成初始化值
//5. 通過擴充套件以增加預設實現的功能
//6. 符合協議以對某類提供標準功能
//class 不同於 struct 的特點:
//1. 允許乙個類繼承另乙個類的特徵
//2. 型別轉換(type casting)允許在執行時檢查和解釋乙個類例項的型別
//3. 解構器允許乙個類例項釋放任何其所被分配的資源
//4. 引用計數允許對乙個類的多次引用
//1. 定義類和結構體
//類和結構體定義方式類似
class someclass
struct somestruct
//每定義乙個類和結構體, 相當於定義了乙個 swift型別. 所以名字要uppercamelcase 方式命名(如 someclass 和somestructure等)
//屬性和方法命名用 lowercamelcase (如framerate和incrementcount)
struct resolution
class videomode
//2. 類和結構體例項
//直接加括號生成的例項, 其屬性均會被初始化為預設值
let someresolution = resolution()
let somevideomode = videomode()
//屬性訪問, 點語法
print("the width of someresolution is \(someresolution.width)")
// 輸出 "the width of someresolution is 0"
print("the width of somevideomode is \(somevideomode.resolution.width)")
// 輸出 "the width of somevideomode is 0"
somevideomode.resolution.width = 1280
print("the width of somevideomode is now \(somevideomode.resolution.width)")
// 輸出 "the width of somevideomode is now 1280"
//注意: 與 objective-c 語言不同的是,swift 允許直接設定結構體屬性的子屬性。上面的最後乙個例子,就是直接設定了somevideomode中resolution屬性的width這個子屬性,以上操作並不需要重新設定resolution屬性。
//3. 結構體型別的成員逐一構造器(memberwise initializers for structure types)
//所有結構體都有乙個自動生成的成員逐一構造器
//類沒有預設的成員逐一構造器
let vga = resolution(width:640, height: 480)
//4. 結構體和列舉是值型別
/*值型別被賦給乙個變數(常量)或者被傳遞給乙個函式的時候,實際上是值的拷貝。
在 swift 中所有的基本型別---整數(integer)、浮點數(floating-point)、布林值(booleans)、字串(string)、陣列(array)和字典(dictionaries),都是值型別,並且都是以結構體的形式在後台所實現。
在 swift 中,所有的結構體和列舉都是值型別。這意味著它們的例項,以及例項中所包含的任何值型別屬性,在**中傳遞的時候都會被複製。
*/let hd = resolution(width: 1920, height: 1080)
var cinema = hd
//resolution是值型別,所以cinema的值其實是hd的乙個拷貝副本,而不是hd本身
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide")
// 輸出 "cinema is now 2048 pixels wide"
print("hd is still \(hd.width ) pixels wide")
// 輸出 "hd is still 1920 pixels wide"
//列舉也是值型別
enum compasspoint
var currentdirection = compasspoint.west
let rememberdirection = currentdirection
currentdirection = .east
if rememberdirection == .west
// 輸出 "the remembered direction is still .west"
//5. class 是引用型別
//與值型別不同,引用型別在被賦予到乙個變數、常量或者被傳遞到乙個函式時,操作的是引用,其並不是拷貝。因此,引用的是已存在的例項本身而不是其拷貝。
let teneighty = videomode()
teneighty.resolution = hd
teneighty.interlaced = true
teneighty.name = "1080i"
teneighty.framerate = 25.0
let alsoteneighty = teneighty
alsoteneighty.framerate = 30.0
print("the framerate property of teneighty is now \(teneighty.framerate)")
// 輸出 "the framerate property of theeighty is now 30.0"
//需要注意的是teneighty和alsoteneighty被宣告為常量((constants)而不是變數。然而你依然可以改變teneighty.framerate和alsoteneighty.framerate,因為這兩個常量本身不會改變。它們並不儲存這個videomode例項,在後台僅僅是對videomode例項的引用。所以,改變的是被引用的基礎videomode的framerate引數,而不改變常量的值。
//6. 恒等運算子
//因為類是引用型別,有可能有多個常量和變數在後台同時引用某乙個類例項。
//判讀兩個常量或變數是否引用同乙個類例項,可以用恒等運算子: 等價於(===), 不等價於(!==)
if teneighty === alsoteneighty
//輸出 "teneighty and alsoteneighty refer to the same resolution instance."
//請注意「等價於"(用三個等號表示,===) 與「等於"(用兩個等號表示,==)的不同:
//「等價於」表示兩個類型別(class type)的常量或者變數引用同乙個類例項。
//「等於」表示兩個例項的值「相等」或「相同」,判定時要遵照類設計者定義的評判標準,因此相比於「相等」,這是一種更加合適的叫法。
//7. 指標
//乙個 swift 常量或者變數引用乙個引用型別的例項與 c 語言中的指標類似,不同的是並不直接指向記憶體中的某個位址,不用使用 * 號。swift 中這些引用與其它的常量或變數的定義方式相同。
//8. 類和結構體的選擇
//結構體的適用場景:
//結構體的主要目的是用來封裝少量相關簡單資料值。
//有理由預計乙個結構體例項在賦值或傳遞時,封裝的資料將會被拷貝而不是被引用。
//任何在結構體中儲存的值型別屬性,也將會被拷貝,而不是被引用。
//結構體不需要去繼承另乙個已存在型別的屬性或者行為。
//合適的結構體候選者包括:
//幾何形狀的大小,封裝乙個width屬性和height屬性,兩者均為double型別。
//一定範圍內的路徑,封裝乙個start屬性和length屬性,兩者均為int型別。
//三維座標系內一點,封裝x,y和z屬性,三者均為double型別。
//在所有其它案例中,定義乙個類,生成乙個它的例項,並通過引用來管理和傳遞。實際中,這意味著絕大部分的自定義資料構造都應該是類,而非結構體。
//9. strings, arrays, dictionaries的賦值和拷貝行為
//swift 中字串(string),陣列(array)和字典(dictionary)型別均以結構體的形式實現, 是值型別. 這意味著當用它們給其它常量或變數,函式賦值時,都會被複製.
//objective-c中字串(nsstring),陣列(nsarray)和字典(nsdictionary)型別均以類的形式實現,是引用型別。
//注意: 實際 copy 由系統管理優化,只有確有必要,實際(actual)拷貝才會被執行。swift 管理所有的值拷貝以確保效能最優化的效能
Swift 結構體和類
結構體 swift結構體也具有封裝的概念 swift結構體比oc c語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類 結構體的定義格式 struct結構體名 struct rect var width double 按構造方法賦初值 var height double 方法 func g...
Swift 類和結構體(class struct)
較傳統的oc語言,swift使用了更多的結構體 在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 boolean 字串 string 陣列 array 和字典 dictionary 都是結構體型別 所以只有熟悉類和結構體各自的特性,才能編寫出更優...
Swift中類和結構體
1.類和結構體對比 swift 中類和結構體有很多共同點 與結構體相比,類還有如下的附加功能 2.類和結構體的定義語法 類和結構體有著類似的定義方式。我們通過關鍵字class和struct來分別表示類和結構體,並在一對大括號中定義它們的具體內容,如下 class videomode struct r...