对 Swift 中函数内部数组的引用
Reference to array inside function in Swift
我正在尝试在函数中引用数组。
像这样:a
和 b
是 Int
的数组。
var inout refArr = &a
if(!someFlag) {
refArr = &b
}
refArr[someIndex] = 30
这不编译,我可以只使用 inout
作为函数参数吗?
如果是这样,我如何在函数内部执行 reference/pointer?
您可以在函数中使用 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
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'
&
只能用于将变量作为 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
}
}
}
有点丑
我正在尝试在函数中引用数组。
像这样:a
和 b
是 Int
的数组。
var inout refArr = &a
if(!someFlag) {
refArr = &b
}
refArr[someIndex] = 30
这不编译,我可以只使用 inout
作为函数参数吗?
如果是这样,我如何在函数内部执行 reference/pointer?
您可以在函数中使用 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
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'
&
只能用于将变量作为 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
}
}
}
有点丑