首页 文章

没有武力的Swift泛型向下翻转

提问于
浏览
0

我尝试创建一些基于通用的代码:

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 回答

  • 1

    您需要删除 ViewModelsCreator 协议和 PlacesListViewModel 类中的 <T> .

    protocol ViewModelsCreator {
        associatedtype T: EditItemViewModelType
        func editItemViewModel() -> T
    }
    
    class PlacesListViewModel: ViewModelsCreator {
        typealias T = EditPlaceViewModel
        func editItemViewModel() -> T {
            return EditPlaceViewModel()
        }
    }
    

    您还可以删除typealias并将 -> T 替换为 PlacesListViewModel 类中的 -> EditPlaceViewModel . 无论哪种方式都有效,但这更明确 .

    class PlacesListViewModel: ViewModelsCreator {
        func editItemViewModel() -> EditPlaceViewModel {
            return EditPlaceViewModel()
        }
    }
    

相关问题