gpt4 book ai didi

swift - Xcode 12 和 OSLog (os.log) : wrapping OSLogMessage causes compile error: Argument must be a string interpolation

转载 作者:行者123 更新时间:2023-12-03 23:46:03 79 4
gpt4 key购买 nike

在 Xcode 12/iOS 14 中,OSLog 获得了对字符串插值的支持(耶!)。但是仍然不可能附加 Hook 以轻松登录到其他 channel ,例如 Crashlytics。
所以我想我会做一个简单的包装器并传递参数。然而,关于字符串插值似乎发生了一些神奇的事情。
提供的新 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)")

包装新的 Logger 结构
所以让我们把它包装在一个结构中:
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)而不是新的结构给出了相同的结果。
有没有办法解决这个问题?我错过了什么吗?

最佳答案

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

关于swift - Xcode 12 和 OSLog (os.log) : wrapping OSLogMessage causes compile error: Argument must be a string interpolation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62675874/

79 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com