結構體實例老是經過值傳遞,類實例老是經過引用傳遞數據結構
先說說值類型和引用類型的區別函數
值類型被賦予給一個變量、常量或者被傳遞給一個函數的時候,其值會被拷貝code
在 Swift 中,全部的結構體和枚舉類型都是值類型。這意味着它們的實例,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被複制。繼承
引用類型在被賦予到一個變量、常量或者被傳遞到一個函數時,其值不會被拷貝。所以,引用的是已存在的實例自己而不是其拷貝。」io
按照通用的準則,當符合一條或多條如下條件時,請考慮構建結構體:變量
該數據結構的主要目的是用來封裝少許相關簡單數據值。 有理由預計該數據結構的實例在被賦值或傳遞時,封裝的數據將會被拷貝而不是被引用。 該數據結構中儲存的值類型屬性,也應該被拷貝,而不是被引用。 該數據結構不須要去繼承另外一個既有類型的屬性或者行爲。
舉例來講,如下情境中適合使用結構體:引用
幾何形狀的大小,封裝一個width屬性和height屬性,二者均爲Double類型。
必定範圍內的路徑,封裝一個start屬性和length屬性,二者均爲Int類型。
三維座標系內一點,封裝x,y和z屬性,三者均爲Double類型。方法
在全部其它案例中,定義一個類,生成一個它的實例,並經過引用來管理和傳遞。實際中,這意味着絕大部分的自定義數據構造都應該是類,而非結構體」數據
Swift 中,許多基本類型,諸如String,Array和Dictionary類型均以結構體的形式實現。這意味着被賦值給新的常量或變量,或者被傳入函數或方法中時,它們的值會被拷貝。co
Objective-C 中NSString,NSArray和NSDictionary類型均以類的形式實現,而並不是結構體。它們在被賦值或者被傳入函數或方法時,不會發生值拷貝,而是傳遞現有實例的引用。