【问题标题】:How to return an inout (reference) in a swift function?如何在 swift 函数中返回 inout(引用)?
【发布时间】: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 的引用?

【问题讨论】:

    标签: arrays swift parameters pass-by-reference


    【解决方案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; 和移动语义的事情。
    猜你喜欢
    • 2018-07-28
    • 2019-07-02
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2023-04-07
    • 2013-01-25
    相关资源
    最近更新 更多