gpt4 book ai didi

ios - 为什么 Swift 数组 insert 和 removeAtIndex 操作行为不一致?

转载 作者:搜寻专家 更新时间:2023-10-31 08:05:29 25 4
gpt4 key购买 nike

我认为按如下方式交换 Swift 数组的第 0 项和第 1 项是合法的:

  • 在索引 0 处调用 removeAtIndex,这会将第一个项目洗牌回索引 0
  • 在索引 1 处插入删除的项目。

但我看到了不一致的行为,具体取决于我的编码方式。

代码

func test() {

class Test {

var array = ["foo", "bar"]

func swap1() { // PRODUCES STRANGE RESULT
array.insert(array.removeAtIndex(0), atIndex:1)
print("---swap1---", xs:array)
}

func swap2() { // PRODUCES EXPECTED RESULT
let item = array.removeAtIndex(0)
array.insert(item, atIndex:1)
print("---swap2---", xs:array)
}

func swap3() { // PRODUCES EXPECTED RESULT
var array = ["foo", "bar"]
array.insert(array.removeAtIndex(0), atIndex:1)
print("---swap3---", xs:array)
}

func print(fn: String, xs: [String]) {
println(fn)
for x in xs { println(x) }
}
}

Test().swap1()
Test().swap2()
Test().swap3()
}

输出

---swap1---
foo
foo
bar
---swap2---
bar
foo
---swap3---
bar
foo

(对我而言)出乎意料的是,swap1() 克隆了第 0 个元素而不是删除它,从上面 swap1 输出中重复的“foo”可以看出。似乎产生这种行为的特征是

  • 将 removeAtIndex() 的结果作为第一个参数传递给 insert() 调用,而不是将其存储在中间常量中(后者由 swap2() 完成)
  • 操作类成员变量而不是函数局部变量(后者由 swap3() 完成)。

我的问题:为什么 swap1() 的行为不同?

最佳答案

您在同一语句中有两个 array 的修改器。这通常是个坏主意,会导致未定义的行为。这与您不想这样做的原因相同:

a = a++ + a++;

从人的角度来看,很明显您首先要删除一个项目,然后将其添加回已从中删除的数组。

从编译器的角度来看,它必须做 3 件事来修改数组:1) 读取原始数组的内容,2) 修改内容,以及 3) 将它们写回。编译器必须在语句中执行两次:

array.insert(array.removeAtIndex(0), atIndex:1)

您希望编译器这样做:

1) temp1 = array
2) temp1.removeItem
3) array = temp1
4) temp2 = array
5) temp2.addItem
6) array = temp2

但它确实做到了:

1) temp1 = array
2) temp2 = array
3) temp2.removeItem
4) array = temp2
5) temp1.addItem
6) array = temp1

编译器的操作顺序是允许的,这就是为什么你不应该把两个修改器放在同一个语句中。

关于ios - 为什么 Swift 数组 insert 和 removeAtIndex 操作行为不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25096641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com