我尝试创建一些基于泛型的代码:

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>协议中的ViewModelsCreatorPlacesListViewModel类。

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/

10-14 12:51