2015-08-25 46 views
0

說我有一個協議:斯威夫特dynamicType不具有通用功能的工作

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'」爲什麼會這樣?我該如何解決它?

+0

您可以發佈'VehicleModel'和'modelIdentifierForVehicle'內相關的代碼? – ABakerSmith

+0

@ABakerSmith當然我更新了這篇文章。基本上,它爲車型提供了一個獨特的關鍵,因爲類型本身不是哈希。 – AttilaTheFun

回答

1

既然你只轉換vehicleTypemodelIdentifierForVehicle一個String,我會說,爲什麼你需要使用限制VVehicleModel,甚至使用泛型都:

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)" 
} 

如果您使用斯威夫特2,你也可以使用一個協議擴展:

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

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