在我提交radar之前,想向社区进行一次合理性检查:
在一个Obj-C的.h文件中:
@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的协议。
我有Bug还是漏掉了什么?
:) Teo
附加信息: 文档建议:
字典键类型的唯一要求是它是可哈希的,并且它实现了“==”。 您确实可以使用协议。
字典键类型的哈希值一个类型必须是可哈希的才能用作字典的键类型,也就是说,该类型必须提供一种计算自身哈希值的方法。哈希值是一个Int值,对于所有比较相等的对象都是相同的,因此如果a == b,则a.hashValue == b.hashValue。
所有Swift的基本类型(如String、Int、Double和Bool)默认都是可哈希的,这些类型都可以用作字典的键。枚举成员值没有关联值(如枚举中所述)也默认是可哈希的。
注意 您可以通过使它们符合Swift标准库中的Hashable协议来将自定义类型用作字典键类型。符合Hashable协议的类型必须提供一个可获取的名为hashValue的Int属性,并且还必须提供“相等”运算符(==)的实现。由类型的hashValue属性返回的值不需要在同一程序的不同执行或不同程序中相同。 有关符合协议的更多信息,请参见协议。
hashValue
和Equatable==
映射到Objective-C NSObject协议的isEqual:
和hash
。 - Teo SartoriObj-C
没有办法表示==
运算符,你也不能将一个方法名桥接到另一个方法名。一个对象可以实现两个方法,但你不能让它们相等,那将是一个危险的先例。无论如何,即使是纯Swift协议,你也不能将其用作字典键的类型。 - Sulthan