5

基本クラスを指定する型を必要とする Swift プロトコルを作成し、その基本クラスのサブクラスで動作するメソッドを実装したいと考えています。これは次のようになります (コンパイルされません)。

protocol Repository {

    associatedtype BaseModel

    //T must subclass BaseModel 
    func all<T: BaseModel>(from type: T.Type) -> [T] 
}

ただし、これにより次のコンパイラ エラーが生成されます。 Inheritance from non-protocol, non-class type 'Self.BaseModel'

BaseModel は構造体型で指定でき、サブクラス化は許可されないため、これは理にかなっています。そこで、クラスに制約された空のプロトコルを作成して、この型がクラス型になり、サブクラスの制約を許可することをコンパイラに通知しようとしました。

protocol Model: class { }

次に、Model クラス プロトコルを使用して BaseModel 型を制約しました。

associatedtype BaseModel: Model

しかし、これは上記と同じコンパイラ エラーを生成します。associatedtypeプロトコルからサブクラスの制約を適用することは可能ですか? 上記がコンパイルされるか、Swift が次のようなものを許可してサブクラスの制約を許可することを期待します。

associatedtype BaseModel: class

4

1 に答える 1

0

関連付けられたタイプは、プロトコルが実装される前にタイプが不明な場合に使用する必要があります。ただし、タイプがわかっている場合は、関連付けられたタイプを使用する必要はありません。私はあなたがこれを行うことができると思います。

protocol Model: class { }

class BaseModel : Model { }

protocol Repository {
        func all<T : BaseModel>(from type: T.Type) -> [T]
}
于 2017-06-29T04:57:24.073 に答える