了解基本的Swift编译器错误

卸妆液

我了解为什么这会导致编译器错误:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift编译器错误

来自分类Dev

获取Swift编译器错误

来自分类Dev

Swift Closure编译器错误

来自分类Dev

ScrollView Swift编译器错误

来自分类Dev

Cocoapods ReactiveKit swift 编译器错误

来自分类Dev

OS X Swift编译器错误-分段错误

来自分类Dev

协议扩展编译器中的Swift 2.2 #selector错误

来自分类Dev

存档时出现Swift编译器错误

来自分类Dev

XCode6 beta 6 Swift编译器错误

来自分类Dev

Swift编译器错误-在发出``tableView''的SIL时

来自分类Dev

Swift编译器错误“失败,退出代码254”

来自分类Dev

Swift编译器“修复”错误循环-可选

来自分类Dev

找不到Swift编译器错误'iostream'

来自分类Dev

存档时出现Swift编译器错误

来自分类Dev

Swift 3.0数组“包含”参数编译器错误

来自分类Dev

Firebase自动完成API导致编译器错误Swift

来自分类Dev

SceneKit Swift3 编译器错误

来自分类Dev

Github exyte Macaw-Examples swift 编译器错误

来自分类Dev

Xcode - 桥接头的 Swift 编译器错误

来自分类Dev

handleDeferredImports 中的 Swift 编译器段错误

来自分类Dev

iOS 单元使用 Alamofire 测试 Swift 编译器错误

来自分类Dev

了解Typescript编译器生成的Javascript

来自分类Dev

了解MSVS C ++编译器优化

来自分类Dev

了解编译器的工作方式

来自分类Dev

隐含编译器错误?

来自分类Dev

奇怪的编译器错误

来自分类Dev

很多编译器错误

来自分类Dev

奇怪的编译器错误

来自分类Dev

奇怪的编译器错误