【发布时间】:2014-09-16 06:59:33
【问题描述】:
在我提交雷达之前,请与社区进行一次健全性检查:
在 .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 的协议。
我有错误还是遗漏了什么?
:) 特奥
其他信息:
documentation 建议:
- 字典的键类型的唯一要求是它是 Hashable 并且它实现了
==。 - 您确实可以使用协议。
字典键类型的哈希值类型必须是可散列的才能用作字典的键类型——也就是说,该类型必须提供一种为自己计算散列值的方法。哈希值是一个 Int 值,对于所有比较相等的对象都相同,因此如果 a == b,则遵循 a.hashValue == b.hashValue。
所有 Swift 的基本类型(例如 String、Int、Double 和 Bool)在默认情况下都是可散列的,并且所有这些类型都可以用作字典的键。默认情况下,没有关联值的枚举成员值(如枚举中所述)也是可散列的。
注意 您可以使用自己的自定义类型作为字典键类型,方法是使它们符合 Swift 标准库中的 Hashable 协议。符合 Hashable 协议的类型必须提供一个名为 hashValue 的可获取 Int 属性,并且还必须提供“等于”运算符 (==) 的实现。类型的 hashValue 属性返回的值不需要在同一程序的不同执行或不同程序中相同。 有关遵守协议的更多信息,请参阅协议。
【问题讨论】:
标签: objective-c swift protocols hashable