在使用泛型时,从封闭体推断闭合返回类型

时间:2016-08-11 06:33:41

标签: swift

如果我从一个例子开始,我认为最好:

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为讨论中的短手闭包表达式选择正确的重载,还是我必须明确声明闭包签名?

1 个答案:

答案 0 :(得分:0)

实际上,似乎我对编译器的限制过于严格(正如@Martin R在评论中指出的那样)。 { a in }闭包有点不完整,因为编译器没有语句可以从中推断出闭包的返回类型。

这有效:

Test<Int>().test { (a: Int) -> Void in () }

与以下内容相同:

func doNothing() { }

Test<Int>().test { (a: Int) -> Void in doNothing() }

在上面的示例中,为编译器提供了最少的信息来确定选择哪个重载。