Swift中如何指定部分泛型参数、其余靠编译器自动推断?
结论
Swift 目前不支持仅显式指定部分泛型参数:泛型参数列表要么全部由编译器自动推断,要么全部显式声明。你可以通过以下两种常用变通方案实现需求,无需同时显式写出两个泛型参数。
方案1:调整构造器,通过入参传递Flag类型(优先推荐)
将需要手动指定的Flag类型作为构造器的入参传入,编译器可以从该入参自动推断出Flag泛型的实际类型,同时从data入参推断DataType类型,完全不需要手动写泛型尖括号:
struct FlagMapper<Flag, DataType> { let data: DataType // 新增构造器,第一个参数接收Flag的类型 init(flagType: Flag.Type, _ data: DataType) { self.data = data } } // 调用方式,不需要写泛型尖括号 let mapper = FlagMapper(flagType: MyFlag.self, data)
方案2:通过静态工厂方法封装构造逻辑
如果你不想修改原有构造器的参数列表,可以通过扩展添加静态工厂方法实现等效效果:
extension FlagMapper { static func create<F>(for flagType: F.Type, data: DataType) -> FlagMapper<F, DataType> { FlagMapper<F, DataType>(data) } } // 调用方式 let mapper = FlagMapper.create(for: MyFlag.self, data: data)
内容的提问来源于stack exchange,提问作者Mischa
相关产品推荐
相关产品推荐

