一尘不染

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

swift

我正在尝试引用函数内部的数组。
像这样:ab是的数组Int

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

这不会编译,我只能inout用于函数参数吗?如果是这样,我该如何在函数内进行引用/指针?


阅读 212

收藏
2020-07-07

共1个答案

一尘不染

&只能用于将变量作为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
        }
    }
}

这有点难看。

2020-07-07