Swift 3的标准库中添加了AnyHashable这一新类型,其用途是在需要Hash值的集合中,可以混合使用多种Hashable类型。例如,字典的key值,其要求是Hashable类型,如果希望key值是任意实现了Hashable协议的类型,则在声明字典时,可以使用AnyHashable作为key的类型,如下代码所示:

let description: [AnyHashable: Any] = [
    AnyHashable("😄"): "emoji",
    AnyHashable(42): "an Int",
    AnyHashable(34.2): "a Double",
    AnyHashable(Set(["a", "b"])): "a set of strings"
]

print(description[AnyHashable(42)]!)        // an Int
print(description[AnyHashable(34)])         // nil
print(description[AnyHashable(Set(["a", "b"]))]!)   // a set of strings

早先,在ObjCSwift混合编程中,ObjCNSDictionary导入到Swift时,是转换成[NSObject: AnyObject]类型。使用NSObject作为key的类型,因为NSObject是最接近于AnyObject且实现了Hashable的类型。不过Swift希望在标准库中限制AnyObject的使用,而更多的使用Any,所以加入了AnyHashable类型。

参考

  1. Add AnyHashable to the standard library