Я пробовал что-то вроде этого:
protocol MyModelProtocol {
var name: String { get set }
}
protocol MyProtocol {
associatedtype Model: MyModelProtocol
func changeModel(_ model: Model)
}
extension MyProtocol where Model: AnyObject {
}
Компилятор идет довольный. Однако внутри этого расширения компилятор по-прежнему не уверен, является ли модель классом или структурой. Пример:
extension MyProtocol where Model: AnyObject {
func changeModel(_ model: Model) {
model.name = "changed"
}
}
Таким образом, я получаю сообщение об ошибке: «Невозможно назначить свойство:« модель »является константой« пусть »».
Как я могу сообщить компилятору, что в этом расширении протокола связанный тип всегда будет классом?
Кстати, это всего лишь короткий пример. Я знаю, что в этом случае я мог бы использовать параметр inout, но он не работает для меня, потому что я хочу изменить объект внутри асинхронного обратного вызова следующим образом:
func changeModel(_ model: inout Model, completion: @escaping () -> Void) {
Api.shared.doRandomAsyncStuff() { (_) in
model.name = "changed"
completion()
}
}
И попытка сделать это приводит меня к ошибке: «Экранирование замыканий может захватывать входные параметры только явно по значению».
protocol MyModelProtocol: class { .. }
- person Martin R   schedule 11.01.2018