&只能用于将变量作为
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 } }}这有点难看。



