如何将 `Wrapped` 转换为 `CVarArg`?

How to convert `Wrapped` to `CVarArg`?

我有一个应用程序可以处理大量需要以

形式显示的可选数据
<Latest value formatted (units)> || "never updated"

很明显我的代码充满了这样的东西:

var pressureString: String {
    (self.lastData != nil) ?
        String(format: "%.2f kPa", self.lastData!.pressure.doubleValue)
        :
        Constants.neverUpdated // NSLocalizedString
}

所以我决定尝试用这个来整理它:

var pressureString: String {
    (self.lastData?.pressure.doubleValue).format("%.2f kPa", or: Constants.neverUpdated)
}

并将format写为:

extension Optional {
    func format(_ formatString: String, or: String) -> String {
        if let s = self {
            return String(format: formatString, s)
        } else {
            return or
        }
    }
}

但是,我收到错误 "Argument type 'Wrapped' does not conform to expected type 'CVarArg'",在 https://developer.apple.com/documentation/swift/cvararg 查找文档时,我看到

Declaring conformance to the CVarArg protocol for types defined outside the standard library is not supported.

...那么是否有 任何 格式化通用 Wrapped 的方法?

Swift 5

你可以写一个扩展,比如 ->

extension Optional where Wrapped == CVarArg {

    func format(_ formatString: String, or: String) -> String {
        guard let self = self else { return or }
        return String(format: formatString, self)
    }
}