我在编写协议(protocol)和执行它的默认实现时遇到问题。
协议(protocol)是 RealmServiceCompatible,对象应该遵守它。 在扩展 RealmServiceCompatible 中,我给出了它的默认实现,但是当我使 Object 符合它时,Xcdoe 仍然要求我编译协议(protocol) stub ..
我无法找出正确的语法。
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
}
最佳答案
您没有提供适用的默认实现:
public var rs: RealmService<Self> { ... }
这仅在以下情况下相关:CompatibleType
== Self
(实现协议(protocol)的类的类型)。但你的协议(protocol)适用于所有可能的CompatibleType
值。
也就是说,我上次检查时,在任何情况下都不能执行此操作(即使您确保处理所有可能的 CompatibleType
值),因为您进入了循环定义。默认实现仅适用于已经符合的事物,但除非它们有实现,否则它们并不符合。原则上,类型检查器可能会退一步说(就像人类所做的那样),“让我们假装它确实符合,即使它还没有,看看通过假装符合它是否真的神奇地确实如此,”但我认为类型检查器今天不会这样做。 (在一般情况下,这实际上是一个相当困难的问题,并且可能会大大增加编译时间,以追寻所有可能的解决方式。)
目前还不清楚你想在这里做什么,因为 RealmServiceCompatible
似乎没有拉任何重量。我怀疑你正在尝试做类似 make SomeClass().rs
的事情返回RealmService<SomeClass>
,而SomeSubClass().rs
返回RealmService<SomeSubClass>
,但这在 Swift 中是不可能的。 RealmService<SomeSubClass>
不是 RealmService<SomeClass>
的子类型因为 Swift 缺乏表达协变的方法,所以这会破坏继承。
感觉就像你试图在这里创造一些神奇的东西,但行不通。
关于iOS swift : Protocol and Types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54062696/