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 回答