Ios Swift:如何声明接受可变/var参数的函数签名?

Ios Swift:如何声明接受可变/var参数的函数签名?,ios,xcode,macos,swift,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

简单的问题,所以希望有一个简单的答案。如何捕获/定义采用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。

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

因此,您的函数
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

正确的!我觉得我错过了一些简单的东西,它是-
var
vs
inout
。奇怪的是,它会给出一个错误——根据你的评论,它应该是不可知论的。显然,我真正想要的是:
typealias Bar=(inout Int)->Int
,这很有效。刚刚看到您的编辑,您正确地推断了我的意图。仍然奇怪的是,它给出了缺少的前导分号错误,但显然编译器团队正在改进错误报告。谢谢。编译器错误通常会更好()。但更好的程度可能是有限的——如果你在不期望的地方抛出关键字,编译器必须猜测你的意图。他们可能无法诊断出所有可能编写非法代码的方法。应该注意的是,在Swift 3中不推荐使用var。