Ios Swift:如何声明接受可变/var参数的函数签名?
简单的问题,所以希望有一个简单的答案。如何捕获/定义采用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
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
vsinout
。奇怪的是,它会给出一个错误——根据你的评论,它应该是不可知论的。显然,我真正想要的是:typealias Bar=(inout Int)->Int
,这很有效。刚刚看到您的编辑,您正确地推断了我的意图。仍然奇怪的是,它给出了缺少的前导分号错误,但显然编译器团队正在改进错误报告。谢谢。编译器错误通常会更好()。但更好的程度可能是有限的——如果你在不期望的地方抛出关键字,编译器必须猜测你的意图。他们可能无法诊断出所有可能编写非法代码的方法。应该注意的是,在Swift 3中不推荐使用var。