代码之家  ›  专栏  ›  技术社区  ›  Remover

了解基本Swift编译器错误

  •  1
  • Remover  · 技术社区  · 8 年前

    我理解为什么这会产生编译器错误:

    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 无效的 那么为什么编译器不抱怨呢?

    1 回复  |  直到 8 年前
        1
  •  1
  •   vacawama    8 年前

    _ 不是 没有什么 。它是一个 图案 或模式的一部分,可以匹配任何内容。它还可以用在赋值语句中,表示您不关心结果。

    _ = 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完成了

    所以,就像你的例子 doit 正在等待一个 (Int) -> () 关闭,但我们正在传递一个 (Int) -> String 关闭。而且它有效。。。

    但是,如果你不评论 print(answer + 1) 行,则 返回“” 然后导致错误:

    void函数中意外的非void返回

    推荐文章