Swift@noescape属性未被弃用?
我对斯威夫特还是相当陌生的。我多次看到的信息之一是,在Swift 3中,@noescape属性已成为默认值,并且已被弃用。但我认为这并不完全正确 我已经编写了自己的日志库。以下是截至昨天的30种(实际上是36种)公共日志记录方法之一:Swift@noescape属性未被弃用?,swift,Swift,我对斯威夫特还是相当陌生的。我多次看到的信息之一是,在Swift 3中,@noescape属性已成为默认值,并且已被弃用。但我认为这并不完全正确 我已经编写了自己的日志库。以下是截至昨天的30种(实际上是36种)公共日志记录方法之一: public static func verbose(_ logItem1 : @autoclosure @escaping () -> Any?, _ logItem2 : @autoclo
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是隐式行为。该关键字已被弃用,但您通过编写它或不编写它而获得的行为是,您的闭包不会脱离该方法的范围。