在swift中, 結構體被重新定義, 它用于很多類所擁有的功能, 幾乎可以和類媲美, 但是在存儲數(shù)據(jù)方面有區(qū)別, 類是引用類型, 結構體是值類型, 所以要根據(jù)存儲數(shù)據(jù)的類型和使用環(huán)境來選擇不同的數(shù)據(jù)結構
類和結構體定義
struct Resolution {
var width = 0
var heigth = 0 //賦初值
}
class VideoMode {
var resolution = Resolution()
var interlaced = false
var frameRate = 0.0
var name: String? //name屬性會被自動賦予一個默認值nil钉蒲,意為“沒有name值”仿滔,因它是一個可選類型与柑。
}
生成結構體和類實例的語法非常相似:
let someResolution = Resolution()
let someVideoMode = VideoMode()
結構體和類的訪問和OC一樣, 都可以通過.語法,訪問屬性和子屬性
someVideoMode.resolution.width //使用點語法訪問
someVideoMode.resolution.width = 1024 //使用點語法賦值
注意:與 Objective-C 語言不同的是,Swift 允許直接設置結構體屬性的子屬性了赌。上面的最后一個例子,就是直接設置了someVideoMode中resolution屬性的width這個子屬性囤热,以上操作并不需要從新設置resolution屬性僵缺。記不記得在OC當中, 你如果要修改一個結構體,, 例如CGRect, 你不可以直接修改frame.origin.y的值, 而是需要構造一個新的CGRect, 然后把這個修改好的CGRect賦值給原來的CGrect
CGRect frame;
frame.origin.x = 100; //這樣是修改不了的
結構體和枚舉是值類型
在 Swift 中,所有的基本類型:整數(shù)(Integer)食绿、浮點數(shù)(floating-point)侈咕、布爾值(Booleans)、字符串(string)器紧、數(shù)組(array)和字典(dictionaries)乎完,都是值類型,并且都是以結構體的形式在后臺所實現(xiàn)品洛。
在 Swift 中,所有的結構體和枚舉都是值類型摩桶。這意味著它們的實例桥状,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被復制硝清。
let tenEighty = VideoMode() //創(chuàng)建一個類并賦值給tenEighty
tenEighty.frameRate = 25.0 //修改tenEighty. tenEighty.frameRate的值
let alsoTenEighty = tenEighty //把tenEighty賦值給一個新的常量
alsoTenEighty.frameRate = 30.0 //使用新的常量修改frameRate的值
print(tenEighty.frameRate) //30.0
需要注意的是tenEighty和alsoTenEighty被聲明為常量(let)而不是變量辅斟。然而你依然可以改變tenEighty.frameRate和alsoTenEighty.frameRate,因為這兩個常量本身不會改變。它們并不儲存這個VideoMode實例芦拿,在后臺僅僅是對VideoMode實例的引用士飒。修改其中一個的值會影響到另外一個, 由此可證明, 他們使用的是同一份數(shù)據(jù), 即引用的是同一個對象. 所以查邢,改變的是被引用的基礎VideoMode的frameRate參數(shù),而不改變常量的值.(這一點與OC不同)
Person *p = [[Person alloc] init];
p.name = @"小米";
Person *p1 = p;
p1.name = @"大米";
NSLog(@"%@, %@", p1.name, p.name); //大米, 大米
類和結構體的選擇
在你的代碼中酵幕,你可以使用類和結構體來定義你的自定義數(shù)據(jù)類型扰藕。
然而,結構體實例總是通過值傳遞芳撒,類實例總是通過引用傳遞邓深。這意味兩者適用不同的任務。當你的在考慮一個工程項目的數(shù)據(jù)構造和功能的時候笔刹,你需要決定每個數(shù)據(jù)構造是定義成類還是結構體芥备。
按照通用的準則,當符合一條或多條以下條件時舌菜,請考慮構建結構體:
結構體的主要目的是用來封裝少量相關簡單數(shù)據(jù)值萌壳。
有理由預計一個結構體實例在賦值或傳遞時,封裝的數(shù)據(jù)將會被拷貝而不是被引用日月。
任何在結構體中儲存的值類型屬性袱瓮,也將會被拷貝,而不是被引用山孔。
結構體不需要去繼承另一個已存在類型的屬性或者行為懂讯。
集合(Collection)類型的賦值和拷貝行為
Swift 中數(shù)組(Array)和字典(Dictionary)類型均以結構體的形式實現(xiàn)。然而當數(shù)組被賦予一個常量或變量台颠,或被傳遞給一個函數(shù)或方法時褐望,其拷貝行為與字典和其它結構體有些許不同。
以下對數(shù)組和結構體的行為描述與對NSArray和NSDictionary的行為描述在本質上不同串前,后者是以類的形式實現(xiàn)瘫里,前者是以結構體的形式實現(xiàn)。NSArray和NSDictionary實例總是以對已有實例引用,而不是拷貝的方式被賦值和傳遞荡碾。
注意:以下是對于數(shù)組谨读,字典,字符串和其它值的拷貝的描述坛吁。 在你的代碼中劳殖,拷貝好像是確實是在有拷貝行為的地方產生過。然而拨脉,在Swift 的后臺中哆姻,只有確有必要,實際(actual)拷貝才會被執(zhí)行玫膀。Swift 管理所有的值拷貝以確保性能最優(yōu)化的性能矛缨,所以你也沒有必要去避免賦值以保證最優(yōu)性能。(實際賦值由系統(tǒng)管理優(yōu)化)
var a = [1, 2, 3]
var b = a
var c = a
a[0] = 42
//修改原來的值, 不會對其他的值產生影響, 字典同樣
println(a[0]) // 42
println(b[0]) // 1
println(c[0]) //1