我了解为什么这会导致编译器错误:
let initialProducer = SignalProducer<Int, NoError>(value:42)
let sideEffectProducer = initialProducer.on(next: { (answer: Int) in
return _
})
错误是
无法将类型'(Int)-> _'的值转换为预期的参数类型'(Int->())?
因此,该next
参数使用一个闭包,该闭包的Int
参数Void
在我们返回的同时返回_
但是为什么这样编译就可以了:
let initialProducer = SignalProducer<Int, NoError>(value:42)
let sideEffectProducer = initialProducer.on(next: { (answer: Int) in
return ""
})
我们返回一个String
,不是Void
,为什么编译器不抱怨?
_
不是什么。它是一个模式,或者是可以匹配任何内容的模式的一部分。也可以在赋值语句中使用它来表明您不在乎结果。
_ = foo() // Ignore result returned from foo
在关闭过程中,如果您不希望返回任何内容,则可以:
return
或完全省略返回值(如果您在结束符结尾处)。
如果返回_
,则Swift无法找出关闭的签名。您可以通过执行以下操作来证明这一点:
let bar = { return _ } // Unable to infer closure return type in current context
如果删除_
,则它bar
会变成,因此编译良好() -> ()
。
Swift会给您更好的错误信息,就像您尝试_
从函数返回的错误信息一样:
func foo() {
return _ // '_' can only appear in a pattern or on the left side of an assignment
}
那么,为什么return ""
起作用呢?这是一个线索。
单行闭包周围有一些明显的怪异之处。考虑以下与您的示例相似的示例:
func doit(handler: (Int) -> ()) {
handler(17)
print("doit is done")
}
doit() { (answer: Int) in
//print(answer + 1)
return ""
}
运行此命令将产生输出:
做完了
因此,就像您的示例doit
期望(Int) -> ()
关闭一样,但是我们正在传递一个(Int) -> String
关闭。而且有效...
但是,如果取消注释该print(answer + 1)
行,return ""
则将导致错误:
无效的非无效返回void函数
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句