代理包装 iOS 14 Logger 类

Lew*_*s42 6 logging swift ios14

我有一个可在 iOS 12 上使用的应用程序。过去我使用过出色的 CocoaLumberjack,但我想转向本机Logger类。

我很高兴不收集旧版 iOS 版本的日志,但我希望该应用程序能够在那里运行。

有没有什么好办法可以避免#available到处打电话呢?一般来说我喜欢#available,但对于日志来说它很笨拙

if #available(iOS 14.0, *) {
     logger.info("Setting person from \(self.person, privacy: .public) to \(newValue, privacy: .public)")
}
Run Code Online (Sandbox Code Playgroud)

如果我包装该类Logger,则无法编译它,因为日志系统有编译时间限制:

import os

public class Logger {

    @available(iOS 14.0, *)
    static let logger = os.Logger(subsystem: "com.progress", category: "ProgressKit")

    public static func debug(_ input: String) {
        if #available(iOS 14.0, *) {
            logger.debug(OSLogMessage(stringLiteral: input)) //  Fails: Argument must be a string interpolation
        } else {
            print(input)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用新系统来做到这一点,而无需#available到处都有声明?

Ale*_*ica 6

实际上,编译器中有一个特殊情况,以确保OSLogMessage只能从字符串文字构造。

https://github.com/apple/swift/pull/31109/files

这意味着没有办法包装它,你被迫:

  1. 通过放弃对 Big Sur 之前的所有内容的支持来加速旧设备的淘汰,并直接使用闪亮的新 API,或者
  2. 不要使用它,而使用 os_log API,尽管它们可能很丑陋。