Мне известно об этом сообщении, в котором представлена та же проблема, что и у меня, но оставшийся без ответа и старый, поэтому я решил обновить его здесь.
//: Playground - noun: a place where people can play
import UIKit
protocol BaseViewModel { }
protocol SomeCellViewModelInterface : BaseViewModel { }
protocol AnotherCellViewModelInterface : BaseViewModel { }
protocol BaseCell {
typealias T
func configure(viewmodel: T)
}
//
class someCell : UIView, BaseCell {
typealias T = SomeCellViewModelInterface
func configure(viewmodel: T) {
// awesome
}
}
class someOtherCell : UIView, BaseCell {
typealias T = AnotherCellViewModelInterface
func configure(viewmodel: T) {
// do stuff
}
}
// the concrete implementations of viewmodels and actually using this UI is ultimatley in another .framework
class ConcreteSomeCellVM : SomeCellViewModelInterface { }
class ConcreteAnotherCellVM : AnotherCellViewModelInterface { }
var viewModel = ConcreteSomeCellVM()
let views: [UIView] = [someCell(), someOtherCell(), UIView()]
Это элементарный пример того, что мне нужно, но он иллюстрирует суть
for v in views {
// A
if let cell = v as? someCell {
cell.configure(viewModel)
}
// B
if let cell = v as? BaseCell {
cell.configure(viewModel)
}
}
Блок A работает, но ему нужно знать конкретный класс ячеек, поэтому, если у меня есть список множества разных ячеек, некоторые из них, для которых я не знаю конкретного типа, не будут работать.
Блок B выдает эту ошибку:
ошибка: протокол «BaseCell» может использоваться только в качестве общего ограничения, поскольку он имеет требования к Self или связанному типу
Есть ли способ достичь блока B?