gpt4 book ai didi

swift - 为什么要定义??运营商使用@autoclosure?

转载 作者:搜寻专家 更新时间:2023-11-01 06:37:52 25 4
gpt4 key购买 nike

??的定义运算符是:

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() 时,它实际上调用图像函数并完成工作并返回图像。但最后我们将丢弃它,因为在这种情况下第一个可选值有一个值。

有了@autocolsure,我们就不会花时间计算我们不需要的东西。我们推迟了计算。

有了这个,

func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T

编译器会将表达式推导为 thatImage ?? image() --> thatImage ?? {return image() }

语句字面上变成这样。

??(thatImage, { return image() } )

并且仅在 block 内,如果第一个参数没有值,编译器才会调用 block ,然后进行计算以获取图像。

关于swift - 为什么要定义??运营商使用@autoclosure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39349127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com