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)