Swift:如何声明采用mutable / var参数的函数签名?

时间:2015-01-13 18:35:14

标签: ios xcode macos swift

简单的问题,希望有一个简单的答案。如何捕获/定义采用var参数的函数类型?

func foo(a:Int) -> Int  {
    return a + 1
}

func bar(var a:Int) -> Int  {
    return ++a
}


// define function type taking a constant parameter like foo above
typealias Foo = (Int)->Int

// try to a function type taking a var parameter like bar above
typealias Bar = (var Int)->Int
    // gives a misleading compiler error about needing a leading semi colon

这看起来像编译错误还是我错过了一些明显的东西?我正在使用Xcode 6.1.1。

1 个答案:

答案 0 :(得分:3)

var对参数的影响是函数实现的内部结果。因为它对函数的调用者没有影响,所以它不是函数签名/类型的一部分。

因此,您的函数bar与函数foo的类型相同,也就是您将其设为Foo的类型。


请注意,您的函数bar不会修改传递的值:

var num = 1
bar(num)    // -> 2
num         // -> 1

如果这就是您要找的内容,您实际需要的是inout参数。 修改函数语义,因此 是函数签名的一部分:

func baz(inout a: Int) -> Int {
    return a++
}
typealias Baz = (inout Int)->Int
let b: Baz = baz
var num = 1
b(&num)     // -> 1 (return from before the post-increment)
num         // -> 2