I have the below code which I am trying to make it generic.
The goals is
-
getVM
should always returnFolderFileListViewModel
instance where listener can only interested state event enum. ex.FolderFileListModelStates
func getVM<T: FolderFileListModelStates>(listener: StateListListener) -> FolderFileListViewModel {
return FolderFileListViewModelHandler<FolderFileListModelStates >(listener: listener)
}
- Is there a way I can pass StateEvents Enum which I am interested in. like below.
extension MyController: StateListListener {
func moved(to state: FolderFileListModelStates) {
}
}
Existing code looks something like this.
protocol StateEvents {}
enum FolderFileListModelStates: StateEvents {
case initiated, loading , listAvailable
}
protocol StateListViewModel {
var listener: StateListListener {get}
init(listener: StateListListener)
}
protocol StateListListener {
func moved(to state: StateEvents)
}
protocol FolderFileListViewModel:StateListViewModel {
func getFileList(for folderName:String, subFolderName:String)
}
class FolderFileListViewModelHandler: FolderFileListViewModel {
private(set) var listener: StateListListener
required init(listener: StateListListener) {
self.listener = listener
}
func getFileList(for folderName: String, subFolderName: String) {
}
}
class ViewModelHandlerFactory {
private init() {}
static let shared = ViewModelHandlerFactory()
func getVM(listener: StateListListener) -> FolderFileListViewModel {
return FolderFileListViewModelHandler(listener: listener)
}
}
class MyController: UIViewController {
func createViewModel() {
let handler = ViewModelHandlerFactory.shared.getVM(listener: self)
}
}
extension MyController: StateListListener {
func moved(to state: StateEvents) {
}
}