如何在Array扩展中确定元素具体类型并返回匹配类型的Set?
问题解答
为什么会显示AnyHashable?
你当前的扩展里把asSet的返回类型硬指定成了Set<AnyHashable>,即便原数组元素是具体类型(比如String),返回的Set也会被强制向上转为AnyHashable类型,所以控制台输出时每个元素都会被AnyHashable包裹显示。
如何返回类型匹配的Set?
只需要把返回类型改成Set<Element>即可——因为扩展已经通过where Element: Hashable约束了元素必须遵循Hashable协议,完全满足Set对元素的类型要求。修改后的代码如下:
extension Array where Element: Hashable { var asSet: Set<Element> { return Set(self) } } let someArray: [String] = ["kiwi", "mango", "mango"] print(someArray.asSet) // 输出: ["kiwi", "mango"]
修改后,someArray.asSet的类型会自动推断为Set<String>,控制台输出时会直接显示元素本身,不会再有AnyHashable的包裹。
额外补充:其实直接调用Set(someArray)就能得到类型匹配的Set,这个扩展的作用只是提供更简洁的语法糖,调整返回类型后就能完美实现你的需求。
内容的提问来源于stack exchange,提问作者lurning too koad
相关产品推荐
相关产品推荐

