我想编写一个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
答案 0 :(得分:0)
在实现协议之前,当类型未知时,应使用关联类型。但是如果知道类型,则不需要使用关联类型。我想你可以做到这一点。
protocol Model: class { }
class BaseModel : Model { }
protocol Repository {
func all<T : BaseModel>(from type: T.Type) -> [T]
}