You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需访问rawValue即可格式化任意RawRepresentable类型?

无需访问rawValue即可格式化RawRepresentable类型

假设我们有几个遵循RawRepresentable协议的结构体,它们的RawValue类型各不相同:

struct Position: RawRepresentable {
    var rawValue: Int
}

struct Link: RawRepresentable {
    var rawValue: URL
}

struct Price: RawRepresentable {
    var rawValue: Double
}

目前要格式化这些值,必须通过访问它们的rawValue来操作:

let position = Position(rawValue: 1000)
let link = Link(rawValue: URL(string: "https://stackoverflow.com")!)
let price = Price(rawValue: 2.99)

position.rawValue.formatted(.number.grouping(.never)) // "1000"
link.rawValue.formatted(.url.scheme(.never)) // "stackoverflow.com"
price.rawValue.formatted(.currency(code: "EUR")) // "€2.99"

这种方式可行,但我们可以通过扩展RawRepresentable协议,实现直接调用formatted方法的优雅写法,无需显式访问rawValue:

extension RawRepresentable where RawValue: FormatStyle.FormatInput {
    func formatted<S>(_ style: S) -> S.FormatOutput where S: FormatStyle, S.FormatInput == RawValue {
        rawValue.formatted(style)
    }
}

添加这个扩展后,就可以像目标写法一样直接调用格式化方法:

position.formatted(.number.grouping(.never)) // "1000"
link.formatted(.url.scheme(.never)) // "stackoverflow.com"
price.formatted(.currency(code: "EUR")) // "€2.99"

这个扩展通过泛型约束实现了适配:只有当RawValue属于某个FormatStyle的输入类型时,才会提供formatted方法,完美适配不同RawValue类型的格式化需求。

内容的提问来源于stack exchange,提问作者parapote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:25:30