说我有一个协议:

protocol VehicleModel {...}


它由许多不同的结构实现。 (例如CarModel,TruckModel等)
我有一个通用的方法来获取车辆的“型号标识符”。

func modelIdentifierForVehicle<V: VehicleModel>(vehicleType: V.Type) -> String {
  return "\(vehicleType)"
}


如果我调用modelIdentifierForVehicle(CarModel.self),则返回“ Car”就好了。但是,如果我有VehicleModel的多态集合,并且尝试在每个模型上调用modelIdentifierForVehicle(model.dynamicType),则Xcode会说“无法使用类型为(VehicleModel.Type)的参数列表调用'modelIdentifierForVehicle'”这是为什么?我该如何解决呢?

最佳答案

由于您只是将vehicleType转换为String中的modelIdentifierForVehicle,因此我会争辩为什么您需要将约束V转换为VehicleModel,甚至完全使用泛型:

func typeIdentifier(t: Any.Type) -> String {
    return "\(t)"
}

let vehicles: [VehicleModel.Type] = [CarModel.self, TruckModel.self]
typeIdentifier(vehicles[0]) // CarModel




如果出于某种原因需要使用VehicleModel,并假设VehicleModel不使用Self或相关类型要求,则可以执行以下操作:

func modelIdentifierForVehicle(vehicleType: VehicleModel.Type) -> String {
    return "\(vehicleType)"
}




如果您使用的是Swift 2,则可以改用协议扩展:

extension VehicleModel {
    static var modelIdentifier: String {
        return "\(self.dynamicType)"
    }
}

// The array from earlier.
vehicles[1].modelIdentifier // TruckModel.Type

关于swift - Swift dynamicType不适用于泛型函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32198189/

10-15 11:10