Swift中对泛型类VehicleWrapper执行Typecasting访问count属性的方法问询
核心原因
Swift 中的泛型属于参数化类型,VehicleWrapper<T> 会随泛型参数 T 的不同成为完全独立的类型,无法在不知道 T 具体类型的前提下直接做类型转换。要实现需求可以通过抽象无泛型协议的方式做中间层,暴露需要访问的属性。
实现方案
方案1(推荐:编译期类型安全,无额外开销)
- 定义无泛型约束的协议,暴露需要访问的接口
// 新增无泛型协议,仅暴露需要用到的属性 protocol VehicleWrapperAccess { var vehicle: Wings & Wheel { get } }
- 让原有泛型类遵守该协议,原有业务逻辑不需要做其他改动
class VehicleWrapper<T: Wings & Wheel>: VehicleWrapperAccess { var vehicle: T // 你的原有初始化、其他逻辑保持不变 init(vehicle: T) { self.vehicle = vehicle } }
- 类型转换时直接转为协议类型,即可访问
count属性
// someObject是你要转换的目标对象 if let wrapper = someObject as? VehicleWrapperAccess { let count = wrapper.vehicle.count // 后续使用count的逻辑 }
方案2(不推荐:仅适用于无法修改原有类定义的场景)
如果不能修改VehicleWrapper的源码,可通过运行时反射读取属性,但编译期无法做类型校验,运行时开销更高:
let mirror = Mirror(reflecting: someObject) if let vehicle = mirror.children.first(where: { $0.label == "vehicle" })?.value as? Wings { let count = vehicle.count }
内容的提问来源于stack exchange,提问作者Nari
相关产品推荐
相关产品推荐

