Swift中Array扩展方法asCast泛型参数T无法推断的解决方法
解决方案
要实现无需显式指定泛型类型调用asCast方法,关键是让编译器自动关联数组元素类型与ASValue的泛型参数,具体修改如下:
修改后的代码
public struct ASValue<T: Hashable>: Hashable { private let id = UUID() var item: T } // 将扩展约束在元素类型为Hashable的数组上 public extension Array where Element: Hashable { // 方法不再需要独立泛型参数,直接使用数组的Element类型 func asCast() -> [ASValue<Element>] { self.map(ASValue.init) } } // 现在可以直接调用,编译器自动推断类型 @State private var numbers = [32, 78, 38, 28, 38].asCast()
原问题分析
原来的实现中,asCast方法自身定义了独立的泛型参数T,编译器无法建立这个T与数组元素类型Element的关联——虽然代码里用了$0 as! T做强制转换,但这是运行时行为,编译期编译器无法确定T应该对应什么类型,因此必须显式指定。
修改后的方案把数组扩展约束为Element: Hashable(匹配ASValue的泛型要求),方法直接使用数组的Element作为ASValue的泛型参数,编译器能直接从数组元素类型推断出返回值类型,无需手动指定泛型。同时还去掉了不安全的强制转换as!,让类型更安全。
内容的提问来源于stack exchange,提问作者Joe Scotto
相关产品推荐
相关产品推荐

