这是我的Swift代码:
map.count: 0
输出:
map.count: 1
但如果取消注释第5行,将输出:
mySet
为什么我需要再次将map["key"]
分配给mySet
? BOOL isPlayingWithOthers = [[AVAudioSession sharedInstance] isOtherAudioPlaying];
不是引用类型吗?
答案 0 :(得分:3)
swift Set
类型是一个结构,意味着它符合值语义。与引用语义相反,使用值语义行为的类型总是在获得对它们的引用时被复制,您永远不能从两个不同的引用中引用相同的值类型。在您的情况下,这意味着var mySet = myMap["key"]
会在地图中创建集合的副本,而不是地图中集合的引用。这意味着您必须将修改后的集合重新分配到地图中以进行更改以反映出来。
查看Apple的这篇快速博客文章,解释价值语义:https://developer.apple.com/swift/blog/?id=10
编辑:正如Nate在评论中指出的那样,Swift实际上并没有创建新的副本,直到修改了值类型,允许运行时共享对值类型的引用,只要它们没有变异,这是一个很好的优化。