Swift 中數(shù)組(Array)和字典(Dictionary)類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)。然而當(dāng)數(shù)組被賦予一個(gè)常量或變量,或被傳遞給一個(gè)函數(shù)或方法時(shí),其拷貝行為與字典和其它結(jié)構(gòu)體有些許不同。
以下對(duì)數(shù)組和結(jié)構(gòu)體的行為描述與對(duì)NSArray和NSDictionary的行為描述在本質(zhì)上不同,后者是以類的形式實(shí)現(xiàn),前者是以結(jié)構(gòu)體的形式實(shí)現(xiàn)。NSArray和NSDictionary實(shí)例總是以對(duì)已有實(shí)例引用,而不是拷貝的方式被賦值和傳遞。
注意:
以下是對(duì)于數(shù)組,字典,字符串和其它值的拷貝的描述。 在你的代碼中,拷貝好像是確實(shí)是在有拷貝行為的地方產(chǎn)生過(guò)。然而,在 Swift 的后臺(tái)中,只有確有必要,實(shí)際(actual)拷貝才會(huì)被執(zhí)行。Swift 管理所有的值拷貝以確保性能最優(yōu)化的性能,所以你也沒(méi)有必要去避免賦值以保證最優(yōu)性能。(實(shí)際賦值由系統(tǒng)管理優(yōu)化)
無(wú)論何時(shí)將一個(gè)字典實(shí)例賦給一個(gè)常量或變量,或者傳遞給一個(gè)函數(shù)或方法,這個(gè)字典會(huì)即會(huì)在賦值或調(diào)用發(fā)生時(shí)被拷貝。在章節(jié)結(jié)構(gòu)體和枚舉是值類型中將會(huì)對(duì)此過(guò)程進(jìn)行詳細(xì)介紹。
如果字典實(shí)例中所儲(chǔ)存的鍵(keys)和/或值(values)是值類型(結(jié)構(gòu)體或枚舉),當(dāng)賦值或調(diào)用發(fā)生時(shí),它們都會(huì)被拷貝。相反,如果鍵(keys)和/或值(values)是引用類型,被拷貝的將會(huì)是引用,而不是被它們引用的類實(shí)例或函數(shù)。字典的鍵和值的拷貝行為與結(jié)構(gòu)體所儲(chǔ)存的屬性的拷貝行為相同。
下面的示例定義了一個(gè)名為ages的字典,其中儲(chǔ)存了四個(gè)人的名字和年齡。ages字典被賦予了一個(gè)名為copiedAges的新變量,同時(shí)ages在賦值的過(guò)程中被拷貝。賦值結(jié)束后,ages和copiedAges成為兩個(gè)相互獨(dú)立的字典。
var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
var copiedAges = ages
這個(gè)字典的鍵(keys)是字符串(String)類型,值(values)是整(Int)類型。這兩種類型在Swift 中都是值類型(value types),所以當(dāng)字典被拷貝時(shí),兩者都會(huì)被拷貝。
我們可以通過(guò)改變一個(gè)字典中的年齡值(age value),檢查另一個(gè)字典中所對(duì)應(yīng)的值,來(lái)證明ages字典確實(shí)是被拷貝了。如果在copiedAges字典中將Peter的值設(shè)為24,那么ages字典仍然會(huì)返回修改前的值23:
copiedAges["Peter"] = 24
println(ages["Peter"])
// 輸出 "23"
在Swift 中,數(shù)組(Arrays)類型的賦值和拷貝行為要比字典(Dictionary)類型的復(fù)雜的多。當(dāng)操作數(shù)組內(nèi)容時(shí),數(shù)組(Array)能提供接近C語(yǔ)言的的性能,并且拷貝行為只有在必要時(shí)才會(huì)發(fā)生。
如果你將一個(gè)數(shù)組(Array)實(shí)例賦給一個(gè)變量或常量,或者將其作為參數(shù)傳遞給函數(shù)或方法調(diào)用,在事件發(fā)生時(shí)數(shù)組的內(nèi)容不會(huì)被拷貝。相反,數(shù)組公用相同的元素序列。當(dāng)你在一個(gè)數(shù)組內(nèi)修改某一元素,修改結(jié)果也會(huì)在另一數(shù)組顯示。
對(duì)數(shù)組來(lái)說(shuō),拷貝行為僅僅當(dāng)操作有可能修改數(shù)組長(zhǎng)度時(shí)才會(huì)發(fā)生。這種行為包括了附加(appending),插入(inserting),刪除(removing)或者使用范圍下標(biāo)(ranged subscript)去替換這一范圍內(nèi)的元素。只有當(dāng)數(shù)組拷貝確要發(fā)生時(shí),數(shù)組內(nèi)容的行為規(guī)則與字典中鍵值的相同,參見(jiàn)章節(jié)[集合(collection)類型的賦值與復(fù)制行為](#assignment_and_copy_behavior_for_collection_types。
下面的示例將一個(gè)整數(shù)(Int)數(shù)組賦給了一個(gè)名為a的變量,繼而又被賦給了變量b和c:
var a = [1, 2, 3]
var b = a
var c = a
我們可以在a,b,c上使用下標(biāo)語(yǔ)法以得到數(shù)組的第一個(gè)元素:
println(a[0])
// 1
println(b[0])
// 1
println(c[0])
// 1
如果通過(guò)下標(biāo)語(yǔ)法修改數(shù)組中某一元素的值,那么a,上一篇:Swift協(xié)議下一篇:Swift類型特性