Skip to main content
 首页 » 操作系统

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

2024年01月01日33mfrbuaa

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