Swift创建对可变数组

时间:2015-05-22 20:04:35

标签: swift

更新 Swift数组太奇怪了。如果需要这种行为,我认为使用NSMutableArray代替更可靠。

我知道Swift通常按值而不是通过引用传递数组,但我需要能够在代码中传递引用,如下所示:

var arr1 = [1, 2, 4]
var arr2 = [4, 6, 3]
var result = pickOne() ? arr1 : arr2
result[2] = 7
// one of these should be updated, currently they are just as initialized
println(arr1)
println(arr2)

我想动态选择两个数组中的一个,并对该数组进行更改。两个数组都是相同的大小和内容类型,我只会更改元素,而不是追加或删除。我怎样才能做到这一点?

编辑:仅使用NSMutableArray代替答案吗?

只是为了澄清:pickOne()是我已经拥有的一个函数,并且基于该函数的结果我想要修改第一个或第二个数组。所以我不需要帮助决定选择哪个。我需要帮助弄清楚如何对所需的数组进行修改(并且会有几个),而不必检查每个修改使用哪个数组。

我可以这样做:

if pickOne() {
    // work on arr1
    // ...
} else {
    // work on arr2
    // ...
}
// do some other work
// ...
if pickOne() {
    // work more on arr1
    // ...
} else {
    // work more on arr2
    // ...
}
// do yet another set of things
// ...
if pickOne() {
    // work again on arr1
    // ...
} else {
    // work again on arr2
    // ...
}

但这很快就会变老。

修改 到目前为止,我已经取得了一些进展

var result = pickOne() ? UnsafeMutableBufferPointer(start: &arr1, count: arr1.count) : UnsafeMutableBufferPointer(start: &arr2, count: arr2.count)

我并不太关心引用是无主的,因为数组实际上是自我强大的属性,所以不应该真正意外释放,但使用肯定看起来很难看。当你尝试做一些如此原始的事情时,你需要用可怕的名字Unsafe调用函数,这是非常令人失望的。

1 个答案:

答案 0 :(得分:1)

使用Swift Array结构无法做到这一点,见下文:

“字符串,数组和字典的赋值和复制行为 Swift的String,Array和Dictionary类型实现为结构。这意味着字符串,数组和字典在分配给新常量或变量时,或者传递给函数或方法时,都会被复制。

此行为与Foundation中的NSString,NSArray和NSDictionary不同,它们实现为类,而不是结构。 NSString,NSArray和NSDictionary实例始终作为对现有实例的引用进行分配和传递,而不是作为副本“

摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/ca/jEUH0.l