如果我从一个例子开始,我认为最好:
class Test<T> {
func test(closure: (T) -> Void) { }
func test(closure: (T) -> T) { }
func test(closure: (T) -> Test<T>) { }
}
Test<Int>().test { a in }
上面的代码给出了以下错误:
错误:模糊地使用'test'
这是因为Swift编译器不知道三种方法中的哪一种应该映射调用。但是从闭包体中很明显它返回Void
,所以它应该选择第一种方法。
看起来Swift编译器无法根据闭包体确定将调用映射到哪个方法重载。如果我明确指定了闭包签名,那么问题就会消失:
Test<Int>().test { (a: Int) -> Void in }
我的问题是:我可以以某种方式指示Swift为讨论中的短手闭包表达式选择正确的重载,还是我必须明确声明闭包签名?
答案 0 :(得分:0)
实际上,似乎我对编译器的限制过于严格(正如@Martin R在评论中指出的那样)。 { a in }
闭包有点不完整,因为编译器没有语句可以从中推断出闭包的返回类型。
这有效:
Test<Int>().test { (a: Int) -> Void in () }
与以下内容相同:
func doNothing() { }
Test<Int>().test { (a: Int) -> Void in doNothing() }
在上面的示例中,为编译器提供了最少的信息来确定选择哪个重载。