- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Xcode 8 将代码转换为 Swift,但编译器警告在一些已在 Swift 2.3 中使用闭包语法创建的嵌套函数中添加 @escape
。我还发现了一些其他关键字 @noescape
和 @autoclosure
,但我对此有一些疑问:
@escaping
有什么影响?@autoclosure
的行为是否与 @escape
相同?这里是 Swift-evolution文件,但从中获益不多。
最佳答案
最重要的区别是 @escaping
和 @noescaping
之间(Swift 3 中没有这样的关键字!)。当闭包被标记为 @noescape
时,您可以确定闭包不会被方法保留(例如执行异步调用),因此您不必担心所有权周期(还有一些其他的小好处)。
@escaping
闭包有时可以在将来保存或调用,因此您必须确保正确处理所有权(例如 [weak self]
)。
对于 @autoclosure
参见 How to use Swift @autoclosure .简而言之,它允许您在某些情况下跳过闭包周围的大括号。
默认(未指定时)是 Swift 3 中的 @noescaping
(参见 rationale)。他们关键字实际上不再存在。只有@escaping
。
关于ios - @noescape、@escaping 和@autoclosure 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39612938/
对这个有点惊讶。在 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
我是一名优秀的程序员,十分优秀!