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)
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |