說我有其中有對象Photo
的Array
類:數組傳遞由默認與線程安全值
class PhotoManager {
fileprivate var _photos: [Photo] = []
var photos: [Photo] {
return _photos
}
}
我讀one article它說以下內容:
默認情況下,在Swift類實例通過引用傳遞並且 結構體按值傳遞。 Swift的內置數據類型(如Array和 Dictionary)以結構體的形式實現。
這意味着上述獲取器返回[Photo]
數組的副本。
然後,同一篇文章中試圖使吸氣線程安全的代碼重構到:
fileprivate let concurrentPhotoQueue = DispatchQueue(label: "com.raywenderlich.GooglyPuff.photoQueue",
attributes: .concurrent)
fileprivate var _photos: [Photo] = []
var photos: [Photo] {
var photosCopy: [Photo]!
concurrentPhotoQueue.sync {
photosCopy = self._photos
}
return photosCopy
}
上面的代碼顯式地使self._photos
一個副本吸氣。
我的問題是:
如果默認SWIFT已經返回一個副本(按值傳遞)之類的文章擺在首位,爲什麼文章中複製再次
photosCopy
,使其線程安全的說?我覺得自己並不完全理解那篇文章中提到的這兩個部分。Swift3是否真的按照默認值傳遞
Array
實例如文章所述?
難道有人能爲我澄清嗎?謝謝!
我已經發布的兩段代碼,我所問的是1號代碼段,其中的文章說,讀方法返回可變數組的副本,我的困惑是,如果是這樣的話,爲什麼筆者文章重構代碼到第二個代碼片段我張貼明確複製數組返回,如果它是默認情況下已經返回數組的副本? –
@ Leem.fin更新了我的回答 –
感謝您的更新,但它沒有清楚地回答我的問題。你提到的更新是我已經理解的。我的問題只是關於「複製」部分。首先,作者默認在swift中說,array是一個通過值傳遞的結構,這意味着默認情況下,read方法已經返回數組的副本。那麼,爲什麼以後它再次複製數組明確地複製,如果默認情況下它被複制到swift?這聽起來像代碼複製數組兩次。 –