AnyHashable是調和objc和Swift的產物
典型的場景是,objc下無泛型的NSDictionary到了Swift下,會變成什么?(典型例子是蘋果來的推送消息)
[Any: Any],這肯定不對,key必須有hash值,
[AnyObject: Any],這也不對,同樣的AnyObject也未必有hash值
大一統一的理論來了,那就是AnyHashable這個Struct
[AnyHashable: Any] 就是 NSDictionary 在Swift下的形態。
定義部分請看頭文件,或官方文檔,我只講用法:
先給出MyClass.h (objc就是這么煩啊,一個簡單的類偏要分成兩個文件)
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyClass : NSObject
@property (nonatomic, copy) NSDictionary *info;
@end
NS_ASSUME_NONNULL_END
下面是MyClass.m
#import "MyClass.h"
@implementation MyClass
- (instancetype)init
{
self = [super init];
if (self) {
_info = @{@"key0": @3, @"key1": @"value"};
}
return self;
}
@end
// 下面是Swift代碼
let c = MyClass()
print(c.info) // [AnyHashable("key1"): value, AnyHashable("key0"): 3]
print(c.info[AnyHashable("key0") as! Int) // 3
print(c.info[AnyHashable("key1") as! String) // value
guard let d = c.info as? [String: Any], let v0 = d["key0"] as? Int, let v1 = d["key1"] as? String else { return }
print("d = \(d)") // d = ["key1": value, "key0": 3]
print("v0 = \(v0), v1 = \(v1)") // v0 = 3, v1 = value
值得注意的是,如果info的加入這樣一對key-value,@3 : @"abc",
那就只能按[AnyHashable: Any] 來處理了。