如何在快速函数中返回inout(引用)?

ldi*_*ual 11 arrays parameters pass-by-reference swift

我想要一个函数来返回一个数组的引用:

var a = [1, 2]
var b = [3, 4]

func arrayToPick(i:Int) -> [Int] {
    return i == 0 ? a : b
}

inout var d = arrayToPick(0)
d[0] = 6

println(a[0]) // 1
println(d[0]) // 6
Run Code Online (Sandbox Code Playgroud)

我无法返回&a&b进入,arrayToPick因为那些无法投入[Int].

如何返回的参考ab从一个函数?

rin*_*aro 17

你不能回报inout价值.因为编译器无法保证值的生命周期.

你有不安全的方式,像这样:

var a = [1, 2]
var b = [3, 4]

func arrayToPick(i:Int) -> UnsafeMutablePointer<[Int]> {
    if i == 0 {
        return withUnsafeMutablePointer(&a, { $0 })
    }
    else {
        return withUnsafeMutablePointer(&b, { $0 })
    }
}

var d = arrayToPick(0)
d.memory[0] = 6

println(a[0]) // -> 6
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在a取消分配后,d.memory访问可能会导致BAD_ACCESS错误.

安全的方式,像这样:

var a = [1, 2]
var b = [3, 4]

func withPickedArray(i:Int, f:(inout [Int]) -> Void) {
    i == 0 ? f(&a) : f(&b)
}

withPickedArray(0) { (inout picked:[Int]) in
    picked[0] = 6
}

println(a[0]) // -> 6
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您只能在闭包中访问拾取的值.

  • @Droopycom Swift这样做了,但是由于一些奇怪的原因,他们选择了“ struct”始终是按值,而“ class”却总是按引用。出于一个更奇怪的原因-数组是一个“结构”。有人应该告诉他们有关运算符`&`的知识,并转移了语义。 (4认同)