Это на самом деле невозможно. Одна сущность, которая реализует несколько протоколов, которые объявляют одно и то же свойство (здесь viewModel
), но с другим типом, просто невозможна в Swift.
Самое близкое, что вы можете сделать, это использовать протокол, который определяет тип viewModel в качестве связанного типа и предоставьте условные расширения (это заставит вас использовать обобщенную c реализацию).
Обратите внимание, что это сложная реализация, требующая хорошего знания generi c протоколы. Я не рекомендовал бы использовать такой сложный дизайн, не понимая точно, что вы делаете.
Просмотр модели
protocol VMProtocol1 {
func vmTest1()
}
protocol VMProtocol2 {
func vmTest2()
}
class ViewModel: VMProtocol1, VMProtocol2 {
func vmTest1() { }
func vmTest2() { }
}
Реализация
protocol VCProtocolBase {
associatedtype ViewModel
var viewModel: ViewModel { get }
}
protocol VCProtocol1: VCProtocolBase {
func vmTest1()
}
protocol VCProtocol2: VCProtocolBase {
func vmTest2()
}
extension VCProtocolBase where Self: VCProtocol1, Self.ViewModel: VMProtocol1 {
func vmTest1() {
viewModel.vmTest1()
}
}
extension VCProtocolBase where Self: VCProtocol2, Self.ViewModel: VMProtocol2 {
func vmTest2() {
viewModel.vmTest2()
}
}
final class VC<ViewModel: VMProtocol1 & VMProtocol2>: VCProtocolBase, VCProtocol1, VCProtocol2 {
var viewModel: ViewModel
init(viewModel: ViewModel) {
self.viewModel = viewModel
}
}
VC(viewModel: ViewModel()).vmTest1()
VC(viewModel: ViewModel()).vmTest2()
Идея заключается в том, чтобы полагаться на универсальные и условные расширения, чтобы обеспечить реализации по умолчанию для VCProtocolX
, который является ролью VCProtocolBase
.