如何为含泛型元素的Array编写带自定义初始化器的扩展
解决方案
你可以通过Swift的泛型约束+where子句实现需求,核心是让编译器明确数组元素类型Element与输入数组元素类型的关联关系。
正确的扩展写法
extension Array { init(_ inputArray: [Input]) where Element == MyGeneric<Input>, Input: Hashable { self = inputArray.map { MyGeneric(someVariable: $0) } } }
使用示例
let items: [Int] = [1, 2, 3, 4, 5] // 类型推断生效,直接调用初始化器 let mapped: [MyGeneric<Int>] = .init(items) // 或者更明确的写法 let mapped2 = Array<MyGeneric<Int>>(items)
代码说明
- 扩展直接作用于
Array,通过where子句约束当前数组的Element必须是MyGeneric<Input>,同时要求Input遵循Hashable(匹配MyGeneric的泛型约束)。 - 初始化器接收
[Input]类型的数组,通过map将每个元素转换为MyGeneric<Input>实例,最终赋值给当前数组。 - 这种写法让编译器能自动推断泛型类型,完全符合你预期的调用方式。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

