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

时间:2018-05-13 06:00:45

标签: swift generics generic-programming

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

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并且应该满足这个泛型。

1 个答案:

答案 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()
    }
}