I want to extend Array to translate arrays into sets, where possible. The following extension does that but in the debugger console, the elements of the set are explicitly labeled AnyHashable. Why is this so? But more importantly, is there a way to determine the concrete type of the element (i.e. String) in the extension so that it returns a type-matching set?

extension Array where Element: Hashable {
    var asSet: Set<AnyHashable> {
        return Set(self)
    }
}

let someArray: [String] = ["kiwi", "mango", "mango"]

print(someArray.asSet) // actual output:  [AnyHashable("kiwi"), AnyHashable("mango")]
                       // desired output: ["kiwi", "mango"]

推荐答案

You can just avoid AnyHashable, and return a set of the generic type:

var asSet: Set<Element> {
    return Set(self)
}

In your example, that will return a Set<String>.

Swift相关问答推荐

不要从 NumberFormatter 获取货币符号

为什么 switch 在 optional 中不接受 case nil?

Vapor - 流利的,将对象保存到 PostgreSQL

符合协议要求委托变量在 ios13 中可用

在 Swift 4 中实现自定义解码器

SwiftUI 中的 .primary 和 .secondary colored颜色 是什么?

Swift中switch 盒的详尽条件

swift 3 如何获取明天和昨天的日期(注意特殊情况)新月或新年

如何停止 NSTimer.scheduledTimerWithTimeInterval

将 UIImage 剪成圆形

在 Swift 中使用 Reachability、NSNotification 和 Network Link Conditioner 检测网络连接变化

使用目标 Select 器进行快速访问控制

从作为闭包的实例属性访问 self

UIPopoverPresentationController 将弹出框显示为全屏

RLMException,对象类型需要迁移

Swift 3 Alamofire 分段上传

我可以将 Xcode 与 iPhone Simulator.app 一起安装在外部硬盘上吗?

为什么非可选的 Any 可以持有 nil?

ios - 无论视图层次如何,都将 UIAlertController 呈现在所有内容之上

使用 swift 打开 PDF 文件