Swift@noescape属性未被弃用?

Swift@noescape属性未被弃用?,swift,Swift,我对斯威夫特还是相当陌生的。我多次看到的信息之一是,在Swift 3中,@noescape属性已成为默认值,并且已被弃用。但我认为这并不完全正确 我已经编写了自己的日志库。以下是截至昨天的30种(实际上是36种)公共日志记录方法之一: public static func verbose(_ logItem1 : @autoclosure @escaping () -> Any?, _ logItem2 : @autoclo

我对斯威夫特还是相当陌生的。我多次看到的信息之一是,在Swift 3中,@noescape属性已成为默认值,并且已被弃用。但我认为这并不完全正确

我已经编写了自己的日志库。以下是截至昨天的30种(实际上是36种)公共日志记录方法之一:

   public static func verbose(_ logItem1 : @autoclosure @escaping () -> Any?,
                              _ logItem2 : @autoclosure @escaping () -> Any?,
                              funcFile : StaticString = #file,
                              funcName : StaticString = #function,
                              lineNumber : Int = #line) {
      if .eVerbose >= _thresholdValue {
         doLogging(logLevel: .eVerbose,
                   funcFile: funcFile, funcName: funcName, lineNumber: lineNumber,
                   logItem1, logItem2)
      }
   }
下面是被调用的私有方法的签名:

   private static func doLogging(logLevel : ELogLevel, funcFile : StaticString,
                                 funcName : StaticString, lineNumber : Int,
                                 _ logItemClosures : () -> Any?...) {
...
      let logItemsFormatted = formatLogArguments(logItemClosures)
...
   }

   private static func formatLogArguments(_ logItemClosures : [() -> Any?])
                                         -> (messageText : String?, errorText : String?) {
...
   }
闭包都在formatLogArguments()方法中计算

我在“log item”参数上使用“@autoclosure@escaping”的灵感来自于查看GitHub上的几个开源日志库。(XCGLogger看起来棒极了。)

但是今天我读了更多关于闭包的内容,我开始思考——这些闭包并不是真正的“转义”,它们都是在外部log方法返回之前被评估(或不评估)的。因此,我尝试从所有日志方法中删除@escaping属性。Swift编译器给了我30条错误信息

然后,为了见鬼,我更改了两个私有方法的签名,如下所示:

   private static func doLogging(logLevel : ELogLevel, funcFile : StaticString,
                                 funcName : StaticString, lineNumber : Int,
                                 _ logItemClosures : @noescape () -> Any?...) {
...
   }

   private static func formatLogArguments(_ logItemClosures : [@noescape () -> Any?])
                                         -> (messageText : String?, errorText : String?) {
...
   }
现在Swift编译器很高兴,我的测试程序运行正常

所以也许@noescape仍然存在并且有用


(我还没有试着分析编译器的输出,看看它是否得到了优化——我的Swift技能还没有达到这个水平。)

@noescape是一种隐式行为。关键字已被弃用,但您通过编写它或不编写它而获得的行为是,闭包没有脱离方法的范围。@noescape是隐式行为。该关键字已被弃用,但您通过编写它或不编写它而获得的行为是,您的闭包不会脱离该方法的范围。