我遇到过(绝对是)一个我不太了解的功能。我有一个闭包,它接收Float
并且没有返回值,也就是(number: Float) -> Void
。在那个闭包中,我对可选值执行调用,而不是强制它展开,因为我喜欢这个行为,因为可选是一个委托(=如果它没有,不做任何事情)。
但是当我这样做时,我收到一个错误:
Cannot convert the expression's type '...' to type Float.
有趣的是,当我简单地添加println()
时,错误就会消失。我已将我的案例简化为一个小例子,用于说明:
var optional: [String : Int]?
let closure: (number: Int) -> Void = { (number) -> Void in
optional?.updateValue(number, forKey: "key")
//println() <-- when this gets uncommented, error disappears
}
我的打赌是编译器可能不喜欢在某些情况下我没有处理浮点数,但由于我没有返回值,那么它应该只是消失了吗?我错过了什么?
答案 0 :(得分:3)
推断出包含单个表达式的表达式返回该结果,因此:
let closure: (number: Int) -> Void = { (number) -> Void in
optional?.updateValue(number, forKey: "key")
}
相当于:
let closure: (number: Int) -> Void = { (number) -> Void in
return optional?.updateValue(number, forKey: "key")
}
您现在在Void
和Int?
之间存在冲突的退货类型(请记住,updateValue
会返回旧值)
使用显式返回将其拆分可以明确推断的输入。
let closure: (number: Int) -> Void = { (number) -> Void in
optional?.updateValue(number, forKey: "key")
return
}
答案 1 :(得分:0)
我认为你的关闭不会像返回零那样因为Void无法转换为nil。
如果你在操场上这样做:
var n: Void = ()
n = nil
您将收到此错误消息: 错误:输入&#39; Void&#39;不符合协议&#39; NilLiteralConvertible&#39;