我遇到了(绝对是)一个我不太了解的功能。我有一个闭包,它接受一个 Float 并且没有返回值,又名 (number: Float) -> Void。在那个闭包中,我对可选值执行调用,而不是强制其解包,因为我喜欢这种行为,因为可选值是一个委托(delegate)(= 如果它是 nil,则不做任何事情)。
但是当我这样做时,我得到一个错误: 无法将表达式的类型“...”转换为 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
}
我敢打赌,在某些情况下,编译器可能不喜欢我不处理 float ,但由于我不返回值,所以它应该消失,对吗?我错过了什么?
请您参考如下方法:
包含单个表达式的表达式被推断为返回该结果,因此:
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
}
