定义是什么??操作员是:

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() } )
只有在块内部,如果第一个参数没有值,编译器才会调用块,然后进行计算以获取图像。

09-20 19:20