- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
??的定义运算符是:
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/
对这个有点惊讶。在 Swift 3 中,这段代码编译... class func test(foo:@autoclosure () -> Void) { } 但这不... typealias Void
考虑以下函数: func whatever(foo: @autoclosure () -> Int) { let x = foo() print(x) } 当然,我们可以这样调用它: what
??的定义运算符是: public func ??(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T 为什么
我今天又开始玩 Swift 并且需要一个 undefined()功能。基本上,一个函数可以是您想要的任何类型,但在实际运行/评估时会崩溃。如果您还没有时间实现某个表达式但想查看程序类型是否检查,这将很
考虑这样的代码: func log(_ msg: @autoclosure @escaping () -> Any?) { print(msg) } class Foo { let b
我注意到在 Swift 中编写 assert 时,第一个值被键入为 @autoclosure() -> Bool 使用重载方法返回通用 T 值,通过 LogicValue protocol 测试是否存
我想知道是否有等同于 Swift's @autoclosure feature 的东西 本质上,我希望能够在一个函数或构造函数/初始化器中创建一个参数,它可以接受另一个接受参数的函数,并执行它: cl
我正在使用 Xcode 8 将代码转换为 Swift,但编译器警告在一些已在 Swift 2.3 中使用闭包语法创建的嵌套函数中添加 @escape。我还发现了一些其他关键字 @noescape 和
我在 Swift 周围闲逛,发现 fatalError 有这个签名: @noreturn public func fatalError(@autoclosure message: () -> Stri
我刚刚将 Xcode 更新到 6.3,以前在 Xcode 6.2 中编译的 Swift 代码现在无法编译。 import Foundation public enum Result { cas
既然 @autoclosure 是参数声明的一部分而不是类型,那么如何声明函数采用可变数量的自动闭包? 之前: public func coalesce(all : @autoclosure () -
我想在 dispatch_async block 中调用一个@autoclosure 参数。 func myFunc(@autoclosure condition: () -> Bool) { d
我是一名优秀的程序员,十分优秀!