我没有在swift stdlib引用中看到很多信息.例如,Dictionary说某些方法(比如删除)会使索引无效,但就是这样.
对于一种称自己为"安全"的语言,它需要一个经典C++脚注的解决方案:
获取向量中的元素指针,然后添加更多元素(指针现在无效),现在使用指针,崩溃
开始迭代集合.迭代时,删除一些元素(在当前迭代器位置之前或之后).继续迭代,崩溃.
(编辑:在c ++中,你很幸运崩溃 - 更糟糕的是内存损坏)
我相信1是由swift解决的,因为如果集合存储类,则对元素进行引用(例如强指针)将增加引用计数.但是,我不知道2的答案.
如果在c ++中对脚趾进行比较,那将是非常有用的.
编辑,由于Robs回答:
看起来似乎有一些未记录的快照式行为与Dictionary和/或for循环一起发生.迭代在启动时创建它的快照/隐藏副本.
这给了我一个很大的"WAT"和"酷,那种安全,我猜","这个副本有多贵?".
我没有在Generator或for循环中看到这个记录.
下面的代码打印了字典的两个逻辑快照.第一个快照userInfo与迭代循环开始时一样,并不反映循环期间所做的任何修改.
var userInfo: [String: String] = [
"first_name" : "Andrei",
"last_name" : "Puni",
"job_title" : "Mad scientist"
]
userInfo["added_one"] = "1" // can modify because it's var
print("first snapshot:")
var hijacked = false
for (key, value) in userInfo {
if !hijacked {
userInfo["added_two"] = "2" // doesn't error
userInfo.removeValueForKey("first_name") // doesn't error
hijacked = true
}
print("- \(key): \(value)")
} …Run Code Online (Sandbox Code Playgroud) 下面的代码没有崩溃,但鉴于"有限"的文档可用,我无法解释原因.
func foo(inout a: [Int], inout b: Int) {
a = []
b = 99
}
var arr = [1,2,3]
// confusion: where does the "out" of b go to?
// storage for a was already cleared / invalidated
foo(&arr, b: &arr[2])
print(arr) // arr is empty
Run Code Online (Sandbox Code Playgroud)