如何在 swift 函数中返回 inout(引用)?
Posted
技术标签:
【中文标题】如何在 swift 函数中返回 inout(引用)?【英文标题】:How to return an inout (reference) in a swift function? 【发布时间】:2015-02-16 19:47:06 【问题描述】:我想要一个返回数组引用的函数:
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
我无法在arrayToPick
中返回&a
或&b
,因为它们无法转换为[Int]
。
如何从函数返回对a
或b
的引用?
【问题讨论】:
【参考方案1】:您不能返回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
在这种情况下,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
在这种情况下,您只能在闭包中访问选取的值。
【讨论】:
为什么swift不能只做引用计数并保证需要它的对象的生命周期? @Droopycom Swift 做到了这一点,但由于一些奇怪的原因,他们选择struct
总是按值,class
总是按引用。出于更奇怪的原因 - 数组是 struct
。应该有人告诉他们关于运算符&
和移动语义的事情。以上是关于如何在 swift 函数中返回 inout(引用)?的主要内容,如果未能解决你的问题,请参考以下文章