Если вы хотите иметь тип свойства динамического протокола, то есть typealias
.
protocol MyViewModel {
var title: String { get set }
}
protocol MyViewController {
typealias MyViewModelType
var viewModel: MyViewModelType { get set }
}
class BaseViewController<T: MyViewModel>: MyViewController {
typealias MyViewModelType = T
var viewModel: T
init(_ viewModel: T) {
self.viewModel = viewModel
}
}
struct CarViewModel: MyViewModel {
var title: String = "Car"
}
struct BikeViewModel: MyViewModel {
var title: String = "Bike"
}
let car = BaseViewController(CarViewModel())
let bike = BaseViewController(BikeViewModel())
Если вы пытаетесь использовать его с моделью, не соответствующей вашему протоколу MyViewModel
, он не будет работать:
struct AnotherModel {
var title: String = "Another"
}
let another = BaseViewController(AnotherModel())
Это имеет несколько подводных камней, как вы не можете передать контроллер представления с помощью аргумента MyViewController
type, по причине typealias
. Это не будет работать:
func something(vc: MyViewController) {
}
Почему не проще подход без typealias
. Если я правильно вас понял, вам они не нужны. Что-то вроде:
protocol MyViewModel {
var title: String { get set }
}
protocol MyViewController {
var viewModel: MyViewModel { get set }
}
class BaseViewController: MyViewController {
var viewModel: MyViewModel
init(_ viewModel: MyViewModel) {
self.viewModel = viewModel
}
}
struct CarViewModel: MyViewModel {
var title: String = "Car"
}
struct BikeViewModel: MyViewModel {
var title: String = "Bike"
}
И теперь вы можете использовать MyViewController
протокол как тип переменной:
let bike: MyViewController = BaseViewController(BikeViewModel())
let car: MyViewController = BaseViewController(CarViewModel())
Вы можете передать его в какой-то функции, как MyViewController
:
func something(vc: MyViewController) {
}
И вы можете» t сделать это также:
struct AnotherViewModel {
var title: String = "Another"
}
let another: MyViewController = BaseViewController(AnotherViewModel())
Я что-то пропустил? Я имею в виду, о ваших дженериках и ограничениях типа? У вас есть какой-то прецедент, который заставляет вас использовать их?