Swift:使用OSLog打印枚举遇‘appendInterpolation无精确匹配’错误如何解决?
如何在OSLog中打印自定义枚举?
问题说明
使用OSLog框架的Logger打印自定义枚举实例时,出现编译错误:No exact matches in call to instance method 'appendInterpolation',但打印Date类型变量可正常执行。测试代码如下:
import OSLog enum MyEnum { case testing } extension Logger { static let testLog = Logger(subsystem: "my sub", category: "testCat") } func testLog() { let me = MyEnum.testing let someDate = Date() // Logger.testLog.info("testing log 1 \(me)") // << 报错:No exact matches in call to instance method 'appendInterpolation' Logger.testLog.info("testing log 1 \(someDate)") // << 正常运行 }
解决方案
方案1:让枚举遵守CustomStringConvertible协议
OSLog的字符串插值支持所有实现了CustomStringConvertible协议的类型,只需为枚举添加协议实现:
enum MyEnum: CustomStringConvertible { case testing var description: String { switch self { case .testing: return "testing" } } }
修改后即可直接用\(me)在日志中打印枚举实例。
方案2:扩展Logger的appendInterpolation方法
若不想让枚举遵守协议,可直接扩展Logger的插值方法,专门适配你的自定义枚举:
extension Logger { func appendInterpolation(_ value: MyEnum) { switch value { case .testing: appendInterpolation("testing") } } }
完成扩展后,原报错的日志代码就能正常编译运行。
原因说明
Date能正常打印是因为系统已为其实现了OSLog所需的插值逻辑,而自定义枚举默认无此支持,因此需要手动添加上述任一方式来实现日志打印。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

