When using MVVM, how do I extend the ViewModel in child ViewControllers?

I have a hierarchy like this:

class OneViewModel {
}

class OneViewController {
  var viewModel = OneViewModel()
}

class TwoViewModel : OneViewModel {
}

class TwoViewController : OneViewController {
  var viewModel = TwoViewModel() // ???
}

I know that overriding property types is not allowed in Swift, but for a child ViewController it makes no sense to transfer two ViewModels models, how would I solve this? Thank!

+4
source share
2 answers

I use this:

class OneViewController {
  var viewModel: OneViewModel {
    return storedViewModel
  }
  lazy var storedViewModel: OneViewModel = {
    type(of: self).viewModelProvider()
  }()
  class func viewModelProvider() -> OneViewModel {
    return OneViewModel()
  }
}

class TwoViewController {
  override var viewModel: TwoViewModel {
    return storedViewModel as! TwoViewModel
  }
  override class func viewModelProvider() -> OneViewModel {
    return TwoViewModel()
  }
}

It is somewhat detailed for customization, but it is easy and understandable to use subsequently.

+1
source

it should work

class OneViewModel {
}

class OneViewController {
    var viewModel = OneViewModel()
}

class TwoViewModel : OneViewModel {
}

class TwoViewController : OneViewController {
    override init() {
        super.init()
        self.viewModel = TwoViewModel()
    }
}

You can install an instance viewModelin a class TwoViewModelanywhere.

+1
source

Source: https://habr.com/ru/post/1672422/


All Articles