为什么这段代码会编译(在Playground中):
func text (f: String -> Void) {
f("text")
}
func foo(s: String) {
countElements(s)
}
text() {
s in
foo(s)
}
这个不是:
func text (f: String -> Void) {
f("text")
}
func foo(s: String) {
countElements(s)
}
text() {
s in
countElements(s)
}
显示错误消息:
Cannot convert the expression's type '(($T3) -> ($T3) -> $T2) -> (($T3) -> $T2) -> $T2' to type '_BuiltinIntegerLiteralConvertible'
我可以说有返回类型的东西,有点Swift认为我想返回int但我只想打印它
答案 0 :(得分:5)
如果添加明确的return
语句,则代码的第二个版本可以使用:
text() {
s in countElements(s)
return
}
发生这种情况的原因是它使用隐式返回,是单个语句闭包,因此它尝试使用countElements
的返回值,它与预期的返回类型{{1}不匹配}}。明确的Void
修复了这一点。
至于为什么它以不同的方式运行,在前一种情况下return
隐式返回foo
,它匹配闭包返回类型。