【发布时间】:2018-01-11 13:09:46
【问题描述】:
我试过这样的:
protocol MyModelProtocol {
var name: String { get set }
}
protocol MyProtocol {
associatedtype Model: MyModelProtocol
func changeModel(_ model: Model)
}
extension MyProtocol where Model: AnyObject {
}
编译器很高兴。但是,在此扩展中,编译器仍然不确定 Model 是类还是结构。示例:
extension MyProtocol where Model: AnyObject {
func changeModel(_ model: Model) {
model.name = "changed"
}
}
因此,我收到错误消息:“无法分配给属性:'model' is a 'let' constant”
我如何告诉编译器在该协议扩展中关联的类型将始终是一个类?
顺便说一句,这只是一个简短的例子。我知道在这种情况下我可以使用 inout 参数,但它对我不起作用,因为我想像这样更改异步回调中的对象:
func changeModel(_ model: inout Model, completion: @escaping () -> Void) {
Api.shared.doRandomAsyncStuff() { (_) in
model.name = "changed"
completion()
}
}
尝试这样做会导致错误:“转义闭包只能按值显式捕获 inout 参数”。
【问题讨论】:
-
您是否也需要值类型(结构、枚举)采用的协议?否则你可以定义一个类协议:
protocol MyModelProtocol: class { .. } -
是的,我愿意。我以前曾经有过,但由于我现在也想使用结构,所以我不得不删除该代码。
标签: ios swift generics protocols associated-types