我在编写协议并对其进行默认实现时遇到问题。
该协议是RealmServiceCompatible,对象应符合该协议。 在扩展RealmServiceCompatible中,我提供了它的默认实现,但是当我将Object与其兼容时,Xcdoe仍然要求我编译协议存根。.
我找不到正确的语法。
protocol RealmServiceCompatible {
associatedtype CompatibleType
var rs: RealmService<CompatibleType> { get }
static var rs: RealmServiceStatic<CompatibleType> { get }
}
extension RealmServiceCompatible {
public var rs: RealmService<Self> {
get {
return RealmService(self)
}
}
public static var rs: RealmServiceStatic<Self> {
get {
return RealmServiceStatic(Self.self)
}
}
}
extension Object: RealmServiceCompatible {
var rs: RealmService<NSObject> {
<#code#>
}
static var rs: RealmServiceStatic<NSObject> {
<#code#>
}
}
Xcode已接受以下内容:
protocol RealmServiceCompatible: AnyObject where CompatibleType: Object {
associatedtype CompatibleType
var rs: RealmService<CompatibleType> { get }
static var rs: RealmServiceStatic<CompatibleType> { get }
}
extension RealmServiceCompatible {
var rs: RealmService<Self> {
return RealmService(self)
}
static var rs: RealmServiceStatic<Self> {
return RealmServiceStatic(Self.self)
}
}
extension Object: RealmServiceCompatible {
typealias CompatibleType = Object
}
答案 0 :(得分:0)
您没有提供适用的默认实现:
public var rs: RealmService<Self> { ... }
这仅在CompatibleType
== Self
(实现协议的类的类型)时才有意义。但是您的协议适用于所有可能的CompatibleType
值。
也就是说,我上次检查时,无论如何都无法执行此操作(即使您确保处理所有可能的CompatibleType
值也是如此),因为您已经获得了循环定义。默认实现仅适用于已经合规的事物,但除非具有实现,否则它们不合规。原则上,类型检查器可以退后一步说(就像人类所做的那样),“让我们假装它确实符合了,即使还不符合,并通过假装真正地神奇地对其进行了验证。确实如此。”但我认为类型检查器今天不会这样做。 (在一般情况下,这实际上是一个非常棘手的问题,可能会增加编译时间,以追逐所有可能解决问题的方法。)
目前还不清楚您要在这里做什么,因为RealmServiceCompatible
似乎并没有发挥任何作用。我怀疑您正在尝试使SomeClass().rs
返回RealmService<SomeClass>
,而SomeSubClass().rs
返回RealmService<SomeSubClass>
的情况,但这在Swift中是不可能的。 RealmService<SomeSubClass>
不是RealmService<SomeClass>
的子类型,因为Swift缺乏表达协方差的方法,因此这会破坏继承。
感觉就像您在尝试使神奇的东西无法正常工作。