作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个协议(protocol):
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’”,这是为什么?我该如何解决这个问题?
最佳答案
由于您仅在 modelIdentifierForVehicle
中将 vehicleType
转换为 String
,我会争论为什么您需要使用 constrain 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,则可以使用协议(protocol)扩展:
extension VehicleModel {
static var modelIdentifier: String {
return "\(self.dynamicType)"
}
}
// The array from earlier.
vehicles[1].modelIdentifier // TruckModel.Type
关于Swift DynamicType 不适用于泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198189/
我是一名优秀的程序员,十分优秀!