Как таковой, ваш текущий код допускает такие вещи, как:
let store = Store<Int, FooViewModel>()
Очевидно, что это не имеет смысла, но ваш код позволяет это, потому что нет никаких ограничений на Model
. Model
может быть чем угодно, не так ли?
Давайте наложим ограничение на:
class Store<Model, ViewModel: StoreViewModel> where Model == ViewModel.Model {
Теперь мы видим, что нет смысла иметь два обобщенных c параметра! Зачем использовать Model
, когда мы можем просто использовать ViewModel.Model
?
class Store<ViewModel: StoreViewModel> {
var models = [ViewModel.Model]()
или, если вы ненавидите длинные имена типов, используйте typealias
:
typealias Model = ViewModel.Model
var models = [Model]()