[英]iOS Swift: Protocol and Types
我在編寫協議並對其進行默認實現時遇到問題。
該協議是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
}
您沒有提供適用的默認實現:
public var rs: RealmService<Self> { ... }
僅當CompatibleType
== Self
(實現協議的類的類型)時才相關。 但是您的協議適用於所有可能的CompatibleType
值。
就是說,上一次我檢查時,無論如何都無法執行此操作(即使您確保處理所有可能的CompatibleType
值),因為您得到了循環定義。 默認實現僅適用於已經合規的事物,但除非具有實現,否則它們不合規。 原則上,類型檢查器可以退后一步說(就像人類所做的那樣),“讓我們假裝它確實符合了,即使還不符合,並通過假裝真正地神奇地對其進行了驗證。確實如此。”但我認為類型檢查器今天不會這樣做。 (在一般情況下,這實際上是一個非常棘手的問題,可能會增加編譯時間,以追逐所有可能解決問題的方法。)
目前還不清楚您要在這里做什么,因為RealmServiceCompatible
似乎並未發揮任何作用。 我懷疑您正在嘗試執行使SomeClass().rs
返回RealmService<SomeClass>
,而SomeSubClass().rs
返回RealmService<SomeSubClass>
,但這在Swift中是不可能的。 RealmService<SomeSubClass>
不是RealmService<SomeClass>
的子類型,因為Swift缺乏表達協方差的方法,因此這會破壞繼承。
感覺就像您在嘗試制作一些無法使用的神奇東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.