2014-10-27 44 views
8

在Swift中,當你傳遞一個值類型時,說一個數組到一個函數。數組的一個副本用於該函數的使用。什麼時候複製發生的快速值類型

然而在https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134文檔還表示:

上述描述指的是字符串,數組和 字典的「複製」。您在代碼中看到的行爲將始終如同發生 複製。但是,當絕對必要時,Swift僅在 後面執行實際副本。 Swift管理所有 值複製以確保最佳性能,並且您不應該避免 分配來嘗試搶佔此優化。

那麼這是否意味着當傳遞的值類型被修改時,實際上只進行了複製操作?

有沒有辦法證明這實際上是潛在的行爲?

爲什麼這很重要?如果我創建一個大型的不可變數組並且想從函數傳遞給函數,我當然不想繼續複製它。我應該在這種情況下使用NSArrray,還是隻要我不嘗試操縱傳入的數組,就會使Swift數組工作正常?

現在,只要我沒有明確地使用var或inout編輯函數中的變量,那麼該函數無論如何都不能修改數組。那麼它是否仍然製作副本?當然,另一個線程可以在其他地方修改原始數組(只有當它是可變的時),在調用該函數的時候創建一個副本是必要的(但只有當傳入的數組是可變的時)。因此,如果原始數組是不可變的,並且函數不使用var或inout,那麼Swift創建副本沒有意義。對?那麼蘋果公司在上面的意思是什麼意思?

+4

據我所知,Swift數組的行爲稱爲「copy on write」,即,正如你所期待的那樣,Swift將會像一個不可變數組一樣明智地行事:因爲你不能寫信給它,它永遠不會被複制。 – 2014-10-27 18:54:07

回答

0

我不知道這是否與Swift中的每個值類型相同,但對於Array s我確定它是一個寫時複製,因此它不會複製它,除非您修改它,並且正如你所說的,如果你把它作爲一個常數傳遞下去,那麼你不會冒這個風險。

p.s.在Swift 1.2中,您可以使用新的API來實現您自己的值類型的寫入拷貝

相關問題