我尝试创建一些基于通用的代码:
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 {}
操场上显示错误:
无法将“EditPlaceViewModel”类型的返回表达式转换为返回类型“T”
并建议使用
return EditPlaceViewModel() as! T
是否有任何解决方案可以避免这种情况(如!T)强制解包代码?我认为编译器应该弄清楚EditPlaceViewModel是EditItemViewModelType并且应该满足这个泛型 .
1 回答
您需要删除
ViewModelsCreator
协议和PlacesListViewModel
类中的<T>
.您还可以删除typealias并将
-> T
替换为PlacesListViewModel
类中的-> EditPlaceViewModel
. 无论哪种方式都有效,但这更明确 .