可选的“不能转换表达式的类型”在封闭体('Cannot convert the expres

2019-10-22 04:23发布

我所遇到的(最绝的)一个功能,我不太明白。 我有一个封闭,这需要一个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
}

我的选择将是编译器可能不喜欢,在某些情况下,我没有处理浮点数,但因为我没有返回值,那么它应该只是消失吗? 我在想什么?

Answer 1:

包含单个表达的表达推断为返回的结果,因此:

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
}


Answer 2:

我觉得你的关闭将不会像回到零,因为太虚不能转换到零。

如果你这样做的操场:

var n: Void = ()
n = nil

你会得到这个错误:错误:类型“无效”不符合协议“NilLiteralConvertible”



文章来源: 'Cannot convert the expression's type' with optional in closure body