'无法转换表达式的类型',在闭包体中带有可选
'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")
}
您现在在 Void
和 Int?
之间有冲突的 return 类型(请记住,updateValue
return 是旧值)
用显式 return 将其拆分可以阐明推断的类型。
let closure: (number: Int) -> Void = { (number) -> Void in
optional?.updateValue(number, forKey: "key")
return
}
我遇到了(绝对是)一个我不太了解的功能。我有一个闭包,它接受一个 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")
}
您现在在 Void
和 Int?
之间有冲突的 return 类型(请记住,updateValue
return 是旧值)
用显式 return 将其拆分可以阐明推断的类型。
let closure: (number: Int) -> Void = { (number) -> Void in
optional?.updateValue(number, forKey: "key")
return
}