代码之家  ›  专栏  ›  技术社区  ›  milczi

Swift通用无强制展开向下投射

  •  0
  • milczi  · 技术社区  · 6 年前

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

    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
    

    是否有任何解决方案可以避免这种(as!T)强制展开代码?我认为编译器应该知道EditPlaceViewModel是EditItemViewModelType,并且应该满足这个泛型。

    1 回复  |  直到 6 年前
        1
  •  1
  •   rmaddy    6 年前

    您需要删除 <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()
        }
    }