gpt4 book ai didi

ios - 了解一个基本的 Swift 编译器错误

转载 作者:行者123 更新时间:2023-11-28 06:43:32 25 4
gpt4 key购买 nike

我明白为什么这会产生编译器错误:

let initialProducer = SignalProducer<Int, NoError>(value:42)
let sideEffectProducer = initialProducer.on(next: { (answer: Int) in
return _
})

错误是

Cannot convert value of type '(Int) -> _' to expected argument type '(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

在你的闭包中,如果你想返回nothing,那么:

return

或者如果您处于闭包的末尾,则完全省略 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 is done

因此,就像您的示例 doit 期待一个 (Int) -> () 闭包,但我们传递的是一个 (Int) -> String 关闭。并且有效...

但是,如果您取消注释 print(answer + 1) 行,则 return "" 会导致错误:

Unexpected non-void return in void function

关于ios - 了解一个基本的 Swift 编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37227216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com