说我有一个协议:
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/