定义是什么??操作员是:
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
为什么不使用t而不是@autoclosure?
这样地:
func ??<T>(optional: T?, defaultValue: T) -> T {
switch optional {
case .some(let value):
return value
case .none:
return defaultValue
}
}
编辑:
@autoclosure
在性能上有什么好处? 最佳答案
如果你同意你的提议func ??<T>(optional: T?, defaultValue: T) -> T
DefaultValue的值将在函数体中直接计算、复制或引用。如果我们真的不使用这个值的话,在很多情况下计算起来会更麻烦。
例如:
var thatImage: UIImage? = somImage
lazy var image() -> UIImage {
return UIImage(named:"imgName")
}
let newImage = thatImage ?? image()
在这种情况下:
func ??<T>(optional: T?, defaultValue: T) -> T
当编译器计算这个
thatImage ?? image()
时,它实际上调用了image函数并完成工作并返回图像。但最后我们将丢弃它,因为在这种情况下,第一个选项有一个值。
有了@autocolsure,我们就不用花时间计算不需要的东西了。我们推迟计算。
有了这个,
func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
编译器将把表达式推导为
thatImage ?? image()
-->thatImage ?? {return image() }
这句话就变成了这个。
??(thatImage, { return image() } )
只有在块内部,如果第一个参数没有值,编译器才会调用块,然后进行计算以获取图像。