小编Kar*_*ett的帖子

与无效的迭代器/索引一起使用时,swift集合的安全性如何?

我没有在swift stdlib引用中看到很多信息.例如,Dictionary说某些方法(比如删除)会使索引无效,但就是这样.

对于一种称自己为"安全"的语言,它需要一个经典C++脚注的解决方案:

  1. 获取向量中的元素指针,然后添加更多元素(指针现在无效),现在使用指针,崩溃

  2. 开始迭代集合.迭代时,删除一些元素(在当前迭代器位置之前或之后).继续迭代,崩溃.

(编辑:在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)

collections iterator invalidation swift

5
推荐指数
1
解决办法
548
查看次数

不确定这个inout场景是如何安全的,因为数组在返回时会失效

下面的代码没有崩溃,但鉴于"有限"的文档可用,我无法解释原因.

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)

arrays invalidation swift

5
推荐指数
1
解决办法
121
查看次数

标签 统计

invalidation ×2

swift ×2

arrays ×1

collections ×1

iterator ×1