Swift 4 - 关联类型的子类通用约束

Pat*_*ley 6 generics swift swift4

我想编写一个Swift协议,它需要一个类型来指定一个基类,并实现对该基类的子类进行操作的方法.这可能是什么样的(不编译):

protocol Repository {

    associatedtype BaseModel

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

但是这会生成以下编译器错误: Inheritance from non-protocol, non-class type 'Self.BaseModel'

这是有道理的,因为BaseModel可以用结构类型指定,并且不允许子类化.所以我尝试创建一个空的协议,约束类,尝试通知编译器这种类型将是类类型并允许子类约束.

protocol Model: class { }

然后我使用Model类协议约束BaseModel类型:

associatedtype BaseModel: Model

但是这会从上面生成相同的编译器错误.是否可以从associatedtype协议上强制执行子类约束?我希望上面的编译或Swift允许类似下面的内容允许子类约束:

associatedtype BaseModel: class

小智 0

当协议实现之前类型未知时,应使用关联类型。但如果类型已知,则无需使用关联类型。我想你可以做到这一点。

protocol Model: class { }

class BaseModel : Model { }

protocol Repository {
        func all<T : BaseModel>(from type: T.Type) -> [T]
}
Run Code Online (Sandbox Code Playgroud)