【发布时间】:2020-05-11 07:08:36
【问题描述】:
有没有办法为已经符合RawRepresentable 的类型添加对协议的一致性?
考虑一个可以在sqlite 数据库中存储原始值的类的基本示例:
protocol DatabaseStoreable {}
extension Int: DatabaseStoreable {}
extension Double: DatabaseStoreable {}
extension String: DatabaseStoreable {}
extension Data: DatabaseStoreable {}
func storeValue<T: DatabaseStoreable>(_ value: T) {
...
}
我还想包含符合RawRepresentable 的任何类型,其中RawValue: DatabaseStorable:
extension RawRepresentable: DatabaseStoreable where Self.RawValue: DatabaseStoreable {}
但是,这会产生以下错误:
协议“RawRepresentable”的扩展不能有继承 子句
有没有办法解决这个问题,因为目前我必须使用以下签名声明第二个函数:
func storeValue<T: RawRepresentable>(_ value: T) where T.RawValue: DatabaseStoreable {
// Calls through to the function above.
}
【问题讨论】:
-
在进行了一些初步研究后,我仍然感到困惑,并且有点好奇最近版本的 Swift 是否有任何变化,因为 SwiftUI 已经出现了一些更新。无论如何,第一个链接有一个引用
SE-0143的答案,而这又在Alternatives Considered下有一个很好的总结,我错过了。 -
我认为您所描述的内容转换为
extension RawRepresntable where Self : DatabaseStoreable, Self.RawValue : DatabaseStoreable {},但我不知道它是否会起作用。