如何在 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]

如何从函数返回对ab 的引用?

【问题讨论】:

【参考方案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。应该有人告诉他们关于运算符&amp; 和移动语义的事情。

以上是关于如何在 swift 函数中返回 inout(引用)?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决转义闭包捕获 Swift 中的“inout”参数?

Swift inout 如何在未更改时不复制回属性,以不触发对象设置器

Swift - 值类型和引用类型的区别

Swift中什么时候用变量参数inout参数

Swift 5:转义闭包捕获'inout'参数

在swift中通过inout参数编写一个var