【问题标题】:Swift function parameters as local variablesSwift 函数参数作为局部变量
【发布时间】:2023-03-24 07:53:01
【问题描述】:

我正在学习 Swift 的一些优点。关于函数参数,文档说:

函数参数默认为常量。

……然后继续讨论 in-out 参数,我想这是 Swift 版本的引用参数。

在其他语言中,参数表现为局部变量,因此您可以毫无顾忌地这样做:

func test(a: Int) {
    a = a + 1   //  cannot assign to a
    print(a*2)
}
var x = 3
test(x)
print(x)    //  -> 3 as before

我知道我可以很容易地创建局部变量,但是 Swift 有没有等效于参数作为局部变量的方法?

注意:

parameter 标签的 SO 描述甚至使用了“标签”一词:

参数是子程序中使用的一种变量,用于引用作为子程序输入提供的数据。

【问题讨论】:

    标签: swift function parameters


    【解决方案1】:

    不确定我是否理解你试图实现的目标,但如果你想修改外部x(所以它不会像以前那样3),那么你必须将函数参数设为inout:

    func test(_ a: inout Int) {
        a = a + 1   //  no error anymore
        print(a*2)
    }
    var x = 3
    test(&x)
    print(x)    //  -> 4
    

    更新:

    func test(_ a: Int) {
        var a = a // make read-write
        a = a + 1
        print(a*2)
    }
    var x = 3
    test(x)
    print(x)    //  -> 3 as before
    

    【讨论】:

    • 在其他语言中,我可以在函数内修改a,而不会影响外部的x。这是因为a 是一个带有x 副本的局部变量。
    【解决方案2】:

    在 Swift 3 之前,Swift 曾经拥有它们。你曾经能够做这样的事情:

    func f(var x: Int) { // note the "var" modifier here
        x += 1
        print(x) // prints 2
    }
    
    var a = 1
    f(a)
    print(a) // prints 1
    

    但它已在 Swift 3 中通过SE-0003 删除。 Swift 社区认为这不是一个好特性。该提案中给出的动机是:

    • var 在函数参数中经常与 inout 混淆。
    • var 经常被混淆以使值类型具有引用语义。
    • 函数参数不是可反驳的模式,例如 if-、while-、guard-、for-in- 和 case 语句。

    【讨论】:

    • 这样就搞定了。我不太确定理由,因为我从未将其视为任何其他语言的问题。无论如何,正如链接文档所说,我总是可以在我的示例中使用 var a = a + 1let 如果没有进一步的突变。谢谢
    • @Manngo 嗯,你为什么要用let 来遮蔽它?如果没有突变,直接使用参数即可!
    • 这可能是真的。当然在这个微不足道的情况下。
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多