Swift 您能否有条件地扩展RawRepresentable以符合另一个协议?

Swift 您能否有条件地扩展RawRepresentable以符合另一个协议?,swift,generics,protocols,Swift,Generics,Protocols,对于已经符合RawRepresentable的类型,是否有方法向协议添加一致性 考虑一个可以在sqlite数据库中存储基元值的类的基本示例: protocol DatabaseStoreable {} extension Int: DatabaseStoreable {} extension Double: DatabaseStoreable {} extension String: DatabaseStoreable {} extension Data: DatabaseStoreable

对于已经符合
RawRepresentable
的类型,是否有方法向协议添加一致性

考虑一个可以在
sqlite
数据库中存储基元值的类的基本示例:

protocol DatabaseStoreable {}

extension Int: DatabaseStoreable {}
extension Double: DatabaseStoreable {}
extension String: DatabaseStoreable {}
extension Data: DatabaseStoreable {}

func storeValue<T: DatabaseStoreable>(_ value: T) {
  ...
}
但是,这会产生以下错误:

协议“RawRepresentable”的扩展不能具有继承 条款

有没有办法解决这个问题,因为目前我必须声明第二个具有以下签名的函数:

func storeValue<T: RawRepresentable>(_ value: T) where T.RawValue: DatabaseStoreable {
  // Calls through to the function above.
}
func storeValue(value:T),其中T.RawValue:DatabaseStoreable{
//调用上述函数。
}

您可以利用条件一致性执行以下操作:

扩展RawRepresentable,其中RawValue:DatabaseStoreable{
func storeValue(value:T){
//做事
}
}
枚举Foo:字符串,数据库可存储{
箱杆
}
Foo.bar.storeValue(“测试”)

顺便说一下:它应该是
DatabaseStorable
,而不是
DatabaseStorable

,因为您的错误消息已经告诉您无法将继承添加到协议中。只能向对象添加继承

因此,这将不起作用:

extension RawRepresentable: DatabaseStoreable {}
但是,您可以添加如下扩展:

protocol DatabaseStoreable {}

extension Int: DatabaseStoreable {}
extension Double: DatabaseStoreable {}
extension String: DatabaseStoreable {}
extension Data: DatabaseStoreable {}

func storeValue<T: DatabaseStoreable>(_ value: T) {
     print("T store(\(value))")
}

extension RawRepresentable {
    func storeValue<T: DatabaseStoreable>(_ value: T) {
        print("RawRepresentable store(\(value))")
    }
}

enum Test: String {
    case A
    case B
}

class DataBaseStore: DatabaseStoreable {}

let myTest = Test.A
let databaseStore = DataBaseStore()
myTest.storeValue(databaseStore) // prints RawRepresentable store(__lldb_expr_15.DataBaseStore)
协议数据库可存储{}
扩展名Int:DatabaseStoreable{}
双扩展名:DatabaseStoreable{}
扩展字符串:DatabaseStoreable{}
扩展数据:DatabaseStoreable{}
func storeValue(value:T){
打印(“T存储(\(值))”)
}
可表示的扩展{
func storeValue(value:T){
打印(“RawRepresentable store(\(value))”)
}
}
枚举测试:字符串{
案例A
案例B
}
类DataBaseStore:DatabaseStoreable{}
让myTest=Test.A
让databaseStore=databaseStore()
myTest.storeValue(databaseStore)//打印可表示的存储(\uuu lldb\u expr\u15.databaseStore)

您检查了吗?在做了一些初步研究之后,我仍然感到困惑,并且有点好奇,鉴于SwiftUI出现了一些更新,最近版本的Swift是否有任何变化。不管怎样,第一个链接有一个答案,它引用了
SE-0143
,在我错过的
备选方案下有一个很好的摘要。我想你描述的是
扩展rawRepresentable,其中Self:DatabaseStoreable,Self.RawValue:DatabaseStoreable{}
,但我不知道它是否会起作用。
protocol DatabaseStoreable {}

extension Int: DatabaseStoreable {}
extension Double: DatabaseStoreable {}
extension String: DatabaseStoreable {}
extension Data: DatabaseStoreable {}

func storeValue<T: DatabaseStoreable>(_ value: T) {
     print("T store(\(value))")
}

extension RawRepresentable {
    func storeValue<T: DatabaseStoreable>(_ value: T) {
        print("RawRepresentable store(\(value))")
    }
}

enum Test: String {
    case A
    case B
}

class DataBaseStore: DatabaseStoreable {}

let myTest = Test.A
let databaseStore = DataBaseStore()
myTest.storeValue(databaseStore) // prints RawRepresentable store(__lldb_expr_15.DataBaseStore)