在Swift中引用函数内部的数组

时间:2015-03-01 16:53:49

标签: arrays swift reference

我试图引用函数内的数组 这样的事情:abInt s的数组。

  var inout refArr = &a
  if(!someFlag) {
     refArr = &b
  }
  refArr[someIndex] = 30

这不编译,我可以只使用inout作为函数参数吗? 如果是这样,我如何在函数内部执行引用/指针?

3 个答案:

答案 0 :(得分:3)

&只能用于将变量作为inout参数传递给函数。因此,最简单的解决方案可能是使用辅助函数 在你的功能中:

func foo() {

    func helper(inout array : [Int]) {
        array[2] = 99
    }

    var a = [1, 2, 3, 5, 6]
    var b = [4, 5, 6, 7]
    let someFlag = true

    if someFlag {
        helper(&a)
    } else {
        helper(&b)
    }

    // ...
}

可以使用UnsafeMutableBufferPointer

创建对数组的引用
let ref = someFlag ?
    UnsafeMutableBufferPointer(start: &a, count: a.count) :
    UnsafeMutableBufferPointer(start: &b, count: b.count)
ref[2] = 99

但这个解决方案存在两个问题:

  • UnsafeMutableBufferPointer()创建一个非拥有的引用, 所以编译器可能决定在引用时释放数组 仍在使用。
  • 阵列上没有边界检查。

为了安全地完成这项工作,你必须添加一些代码:

withExtendedLifetime(a) { () -> Void in
    withExtendedLifetime(b) { () -> Void in
        let ref = someFlag ?
            UnsafeMutableBufferPointer(start: &a, count: a.count) :
            UnsafeMutableBufferPointer(start: &b, count: b.count)
        if ref.count > 2 {
            ref[2] = 99
        }
    }
}

这有点难看。

答案 1 :(得分:0)

您可以在函数中使用inout参数来完成此操作。使用inout修饰符作为参数,并在将值传递给函数时使用&符号(&),如下所示:

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var x = 5
var y = 10

swapTwoInts(&x, &y)

x // 10
y // 5

答案 2 :(得分:0)

swift中的数组不保证在内存中与它们在C中的连续是连续的,因此为了确保您可以访问连续的块,您必须将它们传递给具有inout参数的函数或 - 如果你真的想要在函数中引用一个数组 - 像这样创建一个UnsafeMutableBufferPointer [1]:

var someFlag: Bool = false
var a = ["a", "b", "c"]
var b = ["d", "e", "f"]

var refArr = a.withUnsafeMutableBufferPointer { (inout output: UnsafeMutableBufferPointer<String>) -> UnsafeMutableBufferPointer<String> in

    return output
}

println(refArr[1]) //Will Output 'a'

if !someFlag {
    refArr = b.withUnsafeMutableBufferPointer { (inout output: UnsafeMutableBufferPointer<String>) -> UnsafeMutableBufferPointer<String> in

        return output
    }
}

println(refArr[1]) //Will Output 'e'

1. Thread Safety with Swift Arrays