'无法转换表达式的类型'和闭包体中的可选项

时间:2015-03-05 16:10:39

标签: swift closures optional

我遇到过(绝对是)一个我不太了解的功能。我有一个闭包,它接收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
}

我的打赌是编译器可能不喜欢在某些情况下我没有处理浮点数,但由于我没有返回值,那么它应该只是消失了吗?我错过了什么?

2 个答案:

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

您现在在VoidInt?之间存在冲突的退货类型(请记住,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;