Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift创建对可变数组的引用_Swift - Fatal编程技术网

Swift创建对可变数组的引用

Swift创建对可变数组的引用,swift,Swift,更新Swift数组太奇怪了。如果需要这种行为,我认为只使用NSMutableArrays更可靠 我知道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 initi

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

我知道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)
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
    // ...
}
我想动态选择两个数组中的一个,并对该数组进行更改。两个数组的大小和内容类型相同,我只会更改元素,而不会追加或删除元素。我怎样才能做到这一点

编辑:答案是只使用
NSMutableArray

我想澄清一下:
pickOne()
是我已经拥有的一个函数,根据该函数的结果,我想修改第一个或第二个数组。所以我不需要帮助来决定选择哪一个。我需要帮助了解如何对所需的数组进行修改(将有多个修改),而不必检查每次修改使用哪个数组

我可以这样做:

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)
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)

我不太在乎引用是否无主,因为数组实际上是self的强持有属性,所以不应该意外地发布,但是使用看起来确实很糟糕。在尝试执行如此原始的操作时,需要使用可怕的名称调用函数,这让人非常失望。

使用Swift数组结构无法做到这一点,请参见以下内容:

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

此行为不同于NScript、NSARDATA和NS字典在基础中的实现,它被实现为类,而不是结构。NSString、NSalEngand和NSc字典实例总是被指派和传递给现有实例作为引用,而不是作为副本“

”。
摘自:苹果公司《Swift编程语言》。iBooks

实际上,您是在问如何通过引用传递数组,以便对其进行修改(因为已经有很多关于该数组的问题和参考资料可用),还是在问如何动态选择传递哪个数组?如何通过引用传递。我看到的所有示例都依赖于inout关键字和附加函数的使用,这会变得非常庞大,到目前为止,我还没有成功地将其用于此用例。看起来
UnsafemtableBufferPointer
正在发挥作用,但该死,它很难看。@SaltyNuts:数组是值类型,因此不进行引用计数,这使得安全使用指针变得很困难。使用助手函数可能是最干净的解决方案它被称为“不安全”的MutableBufferPointer,因为该指针不会延长生命周期,并且可以轻松地用于绕过范围检查你同意这可以作为一个副本关闭吗?这个名字很吓人,因为你正在做的事情很吓人。您正在创建别名,而别名是导致bug的常见原因,也是一个非常常见的优化问题。如果系统能够证明没有别名,那么许多编译器优化都是可能的,但是在任意C代码中很难证明这一点。如果你想破坏它,Swift会强迫你去做不安全的事,从而使证明这一点变得容易得多。在某些方面,它们像结构,在某些方面则不然。我不喜欢苹果处理此事的方式。有关更多讨论,请参阅(必须注册为Apple dev才能登录)。