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

时间:2017-06-12 02:01:08

标签: swift generics swift4

我想编写一个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

1 个答案:

答案 0 :(得分:0)

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

protocol Model: class { }

class BaseModel : Model { }

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