首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给Swift字典中包含的元组指定一个属性是否会改变字典本身?

给Swift字典中包含的元组指定一个属性是否会改变字典本身?
EN

Stack Overflow用户
提问于 2016-01-26 01:43:46
回答 2查看 299关注 0票数 0

给出的是一个Swift字典,它将一个Int映射到一个元组。例如:

代码语言:javascript
复制
var tuples: [Int: (Int, Int)] = [1: (1, 1), 2: (2, 2), 3: (3, 3)]

分配一个元组中的一个元素是否会改变字典的内部状态?

代码语言:javascript
复制
tuples[1].0 = 8 // Was the dictionary itself changed now? 

此外,对字典线程中不同元组的并发访问是否是安全的?那么并发访问相同的元组,但元组的不同元素呢?

代码语言:javascript
复制
// 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)是否有相同的行为方式?如果我们使用字典映射到某种对象类型,而不是元组,会发生什么情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-26 01:51:05

是的,这确实改变了字典。包含在另一个聚合中的值类型是该聚合的“一部分”,而不是单独的实体。这适用于字典中的元组,字典中的数组,等等.

考虑到这一点,不,这不安全。在实践中,只要字典是唯一引用的(非唯一引用的字典会在其变异时复制其后备存储),这可能是安全的,但这是很难保证的。

如果将元组包装在一个对象中,这就足够了,只要一次只对任何给定对象执行一个线程即可。

票数 2
EN

Stack Overflow用户

发布于 2016-01-26 01:53:24

只是一个小例子,这样你就可以看到字典确实被修改了:

代码语言:javascript
复制
var test = [1: (1, 1), 2: (2, 2), 3: (3, 3)] { didSet { print("dictionary changed") } }
test[1]?.0 = 3

// Dictionary changed
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35005720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档