簡體   English   中英

iOS Swift:協議和類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM