Swift 无法推断函数的返回类型,该函数的参数是闭包,并且返回类型是从闭包的返回类型推导出来的。
给定这个通用类:
class Bar<T> {
init(_ v:T) {}
func wrap<R>(f:()->R) -> Bar<R> {
return Bar<R>(f())
}
func wrap(f:()->()) -> () {
f()
}
}
功能wrap
被重载,一旦将 Closure 作为返回的参数()
,还有一次采用闭包作为参数,该参数返回指定为类型参数的类型(R
) 为函数。
在下面的代码片段中,很明显闭包的返回类型作为参数传递给函数wrap
is a String
:
var bar :Bar<Int> = Bar<Int>(0)
let b0 = bar.wrap {
return ""
}
恕我直言,编译器现在应该能够推断出返回类型wrap
作为类型Bar<String>
,因此应该能够推断出常量的类型b0
因此。
编译器(从 beta 3 开始)会发出以下错误:
main.swift:53:16: error: type '()' does not conform to protocol 'StringLiteralConvertible'
return ""
^
main.swift:51:9: warning: constant 'b0' inferred to have type '()', which may be unexpected
let b0 = bar.wrap {
^
main.swift:51:9: note: add an explicit type annotation to silence this warning
let b0 = bar.wrap {
^
: ()
这两种解决方法都可以解决该问题:
let b1 = bar.wrap {
() -> String in
return ""
}
let b2:Bar<String> = bar.wrap {
return ""
}
Edit:添加了安东尼奥的答案作为另一个可以正确编译的版本:
let b0 = bar.wrap { "" }
问题是:
假设编译器按指定方式工作,是否有令人信服的原因导致编译器无法推断失败示例中的返回类型?
再次,请考虑这一点:
works: let b0 = bar.wrap { 0 }
fails: let b0 = bar.wrap { return 0 }
或者,这可能是 beta 状态编译器的不完整或不正确实现的影响吗?
注意:请不要在这里发表您的意见,仅发表明确的事实 - 如果有的话。 ;)