gpt4 book ai didi

Swift DynamicType 不适用于泛型函数

转载 作者:行者123 更新时间:2023-11-30 10:12:32 24 4
gpt4 key购买 nike

假设我有一个协议(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com