我想编写一个 Swift 协议(protocol),它需要一个类型来指定一个基类并实现对该基类的子类进行操作的方法。这可能看起来像(不编译):
protocol Repository {
associatedtype BaseModel
//T must subclass BaseModel
func all<T: BaseModel>(from type: T.Type) -> [T]
}
但这会产生以下编译器错误:
从非协议(protocol)、非类类型“Self.BaseModel”继承
这是有道理的,因为可以使用结构类型指定 BaseModel 并且不允许子类化。所以我尝试创建一个空协议(protocol),约束类,试图通知编译器该类型将是类类型并允许子类约束。
协议(protocol)模型:类{}
然后我使用模型类协议(protocol)约束了 BaseModel 类型:
关联类型 BaseModel:模型
但这会产生与上面相同的编译器错误。是否可以在协议(protocol)上从 associatedtype
强制执行子类约束?我希望上面的代码能够编译,或者 Swift 允许像下面这样的东西来允许子类约束:
关联类型 BaseModel:类
最佳答案
如果在实现协议(protocol)之前类型未知,则应使用关联类型。但如果类型已知,则无需使用关联类型。我想你可以做到这一点。
protocol Model: class { }
class BaseModel : Model { }
protocol Repository {
func all<T : BaseModel>(from type: T.Type) -> [T]
}
关于Swift 4 - 关联类型的子类通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44490441/