在我提交雷达之前,只需与社区进行一次完整性检查:
在 .h Obj-C 文件中:
@protocol myProto <NSObject>
@end
在 .swift 文件中(可以通过桥接头访问上述协议定义):
class myClass {
// This line compiles fine
var dictOne: [NSObject:Int]?
// This line fails with "Type 'myProto' does not conform to protocol 'Hashable'"
var dictTwo: [myProto:Int]?
}
对 NSObject 类的检查表明它(或它映射到的 NSObjectProtocol)没有实现 Hashable 协议所需的 hashValue 方法,也没有明确采用它。
因此,尽管如此,在幕后某处 NSObject 仍被标记为 Hashable,但并未扩展到采用 NSObject/NSObjectProtocol 的协议。
我有错误还是我错过了什么?
:) 张
附加信息:
该文档表明:
- 字典的键类型的唯一要求是它是 Hashable 并且它实现了
==
. - 您确实可以使用协议。
字典键类型的哈希值类型必须是可散列的,才能用作字典的键类型——也就是说,该类型必须提供一种为其自身计算散列值的方法。哈希值是对于所有比较相等的对象都相同的 Int 值,因此如果 a == b,则遵循 a.hashValue == b.hashValue。
Swift 的所有基本类型(例如 String、Int、Double 和 Bool)默认都是可散列的,所有这些类型都可以用作字典的键。默认情况下,没有关联值的枚举成员值(如枚举中所述)也是可散列的。
注意你可以使用你自己的自定义类型作为字典键类型,方法是让它们符合 Swift 标准库中的 Hashable 协议。符合 Hashable 协议的类型必须提供称为 hashValue 的可获取 Int 属性,并且还必须提供“等于”运算符 (==) 的实现。类型的 hashValue 属性返回的值不需要在同一程序的不同执行或不同程序中相同。有关遵守协议的更多信息,请参阅协议。