给出的是一个Swift字典,它将一个Int映射到一个元组。例如:
var tuples: [Int: (Int, Int)] = [1: (1, 1), 2: (2, 2), 3: (3, 3)]分配一个元组中的一个元素是否会改变字典的内部状态?
tuples[1].0 = 8 // Was the dictionary itself changed now? 此外,对字典线程中不同元组的并发访问是否是安全的?那么并发访问相同的元组,但元组的不同元素呢?
// Is this safe?
dispatch_async(queue1) {
tuples[1].0 = 10
}
dispatch_async(queue2) {
tuples[1].1 = 10
}
// What about this?
dispatch_async(queue1) {
tuples[1].0 = 10
}
dispatch_async(queue2) {
tuples[2].1 = 10
}其他Swift集合(例如Array)是否有相同的行为方式?如果我们使用字典映射到某种对象类型,而不是元组,会发生什么情况?
发布于 2016-01-26 01:51:05
是的,这确实改变了字典。包含在另一个聚合中的值类型是该聚合的“一部分”,而不是单独的实体。这适用于字典中的元组,字典中的数组,等等.
考虑到这一点,不,这不安全。在实践中,只要字典是唯一引用的(非唯一引用的字典会在其变异时复制其后备存储),这可能是安全的,但这是很难保证的。
如果将元组包装在一个对象中,这就足够了,只要一次只对任何给定对象执行一个线程即可。
发布于 2016-01-26 01:53:24
只是一个小例子,这样你就可以看到字典确实被修改了:
var test = [1: (1, 1), 2: (2, 2), 3: (3, 3)] { didSet { print("dictionary changed") } }
test[1]?.0 = 3
// Dictionary changedhttps://stackoverflow.com/questions/35005720
复制相似问题