说我有个规矩:
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‘”为什么?我怎么才能解决这个问题?
发布于 2015-08-25 12:57:49
由于您只是将vehicleType转换为modelIdentifierForVehicle中的一个String,所以我会争论为什么您需要使用约束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.Typehttps://stackoverflow.com/questions/32198189
复制相似问题