我尝试创建一些基于泛型的代码:
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,并且应该满足这个泛型。
最佳答案
您需要删除<T>
协议中的ViewModelsCreator
和PlacesListViewModel
类。
protocol ViewModelsCreator {
associatedtype T: EditItemViewModelType
func editItemViewModel() -> T
}
class PlacesListViewModel: ViewModelsCreator {
typealias T = EditPlaceViewModel
func editItemViewModel() -> T {
return EditPlaceViewModel()
}
}
您还可以删除typealias并在
-> T
类中将-> EditPlaceViewModel
替换为PlacesListViewModel
。这两种方式都可以,但这更为明确。class PlacesListViewModel: ViewModelsCreator {
func editItemViewModel() -> EditPlaceViewModel {
return EditPlaceViewModel()
}
}
关于swift - 快速通用,无需强制解包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50313210/