'无法转换表达式的类型',在闭包体中带有可选

'Cannot convert the expression's type' with optional in closure body

我遇到了(绝对是)一个我不太了解的功能。我有一个闭包,它接受一个 Float 并且没有 return 值,又名 (number: Float) -> Void。在那个闭包中,我对可选值执行调用,而不是强制其解包,因为我喜欢这种行为,因为可选值是一个委托(= 如果它是 nil,则不做任何事情)。

但是当我这样做时,出现错误: 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
}

我敢打赌,在某些情况下,编译器可能不喜欢我不处理浮点数,但由于我没有 returning 该值,所以它应该会消失,对吗?我错过了什么?

我认为您的闭包不会喜欢返回 nil,因为 Void 无法转换为 nil。

如果你在游乐场这样做:

var n: Void = ()
n = nil

您将收到此错误: 错误:类型 'Void' 不符合协议 'NilLiteralConvertible'

包含单个表达式的表达式被推断为 return 结果,因此:

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")
}

您现在在 VoidInt? 之间有冲突的 return 类型(请记住,updateValue return 是旧值)

用显式 return 将其拆分可以阐明推断的类型。

let closure: (number: Int) -> Void = { (number) -> Void in
    optional?.updateValue(number, forKey: "key")
    return
}