在我提交雷达之前,只需与社区进行一次健全性检查:
在.h Obj-C文件中:
@protocol myProto <NSObject>
@end
在 .swift 文件中(可以通过桥接头访问上述协议(protocol)定义):
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 协议(protocol)所需的 hashValue 方法,也没有明确采用它。
因此,尽管如此,NSObject 在幕后的某个地方仍被标记为 Hashable,但并未扩展到采用 NSObject/NSObjectProtocol 的协议(protocol)。
我有错误还是遗漏了什么?
:)
特奥
附加信息:
documentation 表明:
==
。 最佳答案
NSObjectProtocol
不继承自 Hashable
。这就是这里的关键问题。
它实际上不能从 Hashable
继承,因为 Hashable
需要一个名为 hashValue
的方法,而 NSObjectProtocol
需要一个名为 hash
的方法。
另一方面, NSObject
类可以同时实现 NSObjectProtocol
和 Hashable
。Equatable
也会出现同样的问题。
编辑:
还有一个更微妙的问题。您不能在需要 Equatable
的地方使用协议(protocol),您始终需要使用采用 Equatable
的类类型或值类型。原因是一个键采用 Equatable
是不够的,字典中的所有键都必须彼此相等。
例如,如果您有一个类 A
和一个类 B
,两者都符合 Equatable
,那么您可以将 A
的实例与 A
的其他实例进行比较,并且您可以将 B
的实例与 B
的其他实例进行比较,但您不能比较 A
的实例带有 B
的实例。这就是为什么不能将 A
的实例和 B
的实例用作同一字典中的键的原因。
请注意,每个 NSObject
都可以与任何其他 NSObject
相等,因此 NSObject
是字典中允许的键类型。
关于objective-c - NSObject 是 Hashable 但采用 NSObject 的协议(protocol)不是?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24938503/