如何无需访问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
相关产品推荐
相关产品推荐

