Xcode 12和操作系统日志(os.log): Package OSLogMessage导致编译错误:参数必须是字符串插值

jmo0nnb3  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(100)

在Xcode 12/iOS 14中,OSLog获得了字符串插值的支持(耶!),但它仍然不能连接钩子来轻松地记录其他通道,如Crashlytics。
所以我想我只需要做一个简单的 Package 器并传递参数,然而,在字符串插值方面似乎发生了一些神奇的事情。
提供了新的Logger类,它以OSLogMessage作为参数,可按如下方式使用:

let someVar = "some var"
let logger = Logger(subsystem: "com.my.app", category: "UI")

logger.error("some message")
logger.error("some message with default var: \(someVar)")
logger.error("some message with private var: \(someVar, privacy: .private)")
logger.error("some message with private var: \(someVar, privacy: .private(mask: .hash))")
logger.error("some message with public var: \(someVar, privacy: .public)")

Package 新的记录器结构

所以我们把它 Package 成一个结构体:

struct MyLogger {
    let logger = Logger(subsystem: "com.my.app", category: "UI")

    func error(_ message: OSLogMessage) {
        logger.error(message)
    }
}

相同的签名,但不幸的是,编译器不允许这样做:

ERROR: Argument must be a string interpolation

此外,尝试调用我的结构还会导致一个奇怪的特定编译器错误:

let logger = MyLogger()
let value = "value"
logger.error("Some log message \(value, privacy: .public)")

产量:

String interpolation cannot be used in this context; if you are calling an os_log function, try a different overload

直接调用os_log(_: OSLogMessage)而不是new struct会得到相同的结果。
有办法解决吗?我错过什么了吗?

dy2hfwbg

dy2hfwbg1#

Apple Forums
日志API使用特殊的编译器功能在编译时评估隐私级别。正如诊断程序所说,您必须使用静态(即在编译时已知)方法或"OSLogPrivacy"属性;它不能是一个在运行时求值的变量,这意味着如果不使用编译器内部的特性,就不能为这些API创建自己的 Package 器。

vwhgwdsa

vwhgwdsa2#

我只是使用类似下面的代码来解决这个限制:

struct MyLogger {
    let logger = Logger(subsystem: "com.my.app", category: "UI")

    func error(_ message: String) {
        logger.error("\(message)")
    }
}

相关问题