【发布时间】:2018-01-08 06:59:36
【问题描述】:
假设我有一个类有 Array 对象 Photo:
class PhotoManager {
fileprivate var _photos: [Photo] = []
var photos: [Photo] {
return _photos
}
}
我读到了one article,上面写着:
默认情况下,Swift 中的类实例是通过引用传递的,并且 按值传递的结构。 Swift 的内置数据类型,如 Array 和 字典,被实现为结构。
意思是上面的getter返回了[Photo]数组的一个副本。
然后,同一篇文章试图通过将代码重构为使 getter 线程安全:
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
}
上面的代码明确地在getter中复制了self._photos。
我的问题是:
如果默认情况下 swift 已经像文章开头所说的那样返回一个副本(按值传递),为什么要将文章再次复制到
photosCopy以使其成为线程安全的?我觉得我自己并不完全理解那篇文章中提到的这两部分。Swift3 真的像文章所说的那样默认为
Array实例传递值吗?
有人可以帮我澄清一下吗?谢谢!
【问题讨论】:
标签: swift multithreading swift3 concurrency thread-safety