我尝试创建一些基于通用的代码:
protocol ViewModelsCreator {
associatedtype T: EditItemViewModelType
func editItemViewModel<T>() -> T
}
class PlacesListViewModel: ViewModelsCreator {
typealias T = EditPlaceViewModel
func editItemViewModel<T>() -> T {
return EditPlaceViewModel()
}
}
class EditPlaceViewModel: EditItemViewModelType {}
protocol EditItemViewModelType {}
游乐场显示错误:
无法转换类型&#39; EditPlaceViewModel&#39;的返回表达式至 返回类型&#39; T&#39;
并建议使用
return EditPlaceViewModel() as! T
是否有任何解决方案可以避免这种情况(如!T)强制解包代码?我认为编译器应该弄清楚EditPlaceViewModel是EditItemViewModelType并且应该满足这个泛型。
答案 0 :(得分:1)
您需要删除<T>
协议和ViewModelsCreator
类中的PlacesListViewModel
。
protocol ViewModelsCreator {
associatedtype T: EditItemViewModelType
func editItemViewModel() -> T
}
class PlacesListViewModel: ViewModelsCreator {
typealias T = EditPlaceViewModel
func editItemViewModel() -> T {
return EditPlaceViewModel()
}
}
您还可以删除类型,并将-> T
替换为-> EditPlaceViewModel
类中的PlacesListViewModel
。它可以两种方式工作,但这更明确。
class PlacesListViewModel: ViewModelsCreator {
func editItemViewModel() -> EditPlaceViewModel {
return EditPlaceViewModel()
}
}