Я использую Xcode 7 бета-6 и у меня есть следующий код:Невозможно присвоить свойству в протоколе стесненного в классе - Swift ошибок компилятора
public protocol ViewForViewModel {
typealias ViewModelType
var viewModel: ViewModelType! { get set }
func bindToViewModel()
}
func afterViewInstantiated <V : ViewForViewModel where V: UIViewController, V.ViewModelType: AnyObject>(view : V, viewModel: V.ViewModelType) -> V {
//Cannot assign to property: 'view' is a 'let' constant
view.viewModel = viewModel // error here
VMTracker.append(viewModel, view: view)
return view
}
Компилятор жалуется на присвоение view.viewModel = viewModel
. Я понимаю, что протокол ViewForViewModel
не ограничивается классом, но тип V
ограничен классом UIViewController
. Это ошибка или функция?
UPD: она даже жалуется на UITableViewCell
переменную:
func registerBinding<V: BindableCellView where V: UITableViewCell>(viewType: V.Type) {
let typeName = nameOfType(V.ViewModelType.self)
bindings[typeName] = { [unowned self] viewModel, indexPath in
let view = self.tableView.dequeueReusableCellWithIdentifier(V.CellIdentifier, forIndexPath: indexPath) as! V
//Cannot assign to 'viewModel' because 'view' is a 'let' constant
//However view is UITableViewCell that support ViewForViewModel protocol
view.viewModel = viewModel as! V.ViewModelType
self.onWillBind?(view, indexPath)
view.bindToViewModel()
self.onDidBind?(view, indexPath)
return view
}
}
Ошибка такая же. Кстати, я обновил второй пример. Кажется, что компилятор просматривает тип протокола, игнорируя только тот тип, который его реализует. – HeMet
@HeMet Вы получаете то же сообщение об ошибке, если вы меняете подпись? Вы пробовали это на детской площадке? – Qbyte
Да, это помогает. Я думаю, что это действительно «нереализованная функция», которая не может сделать вывод о том, кто поддерживает протокол в этом случае. Отмечено как ответ. – HeMet