在我提交雷达之前,只需与社区进行一次健全性检查:

在.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 表明:
  • 字典的键类型的唯一要求是它是可哈希的并且它实现了 ==
  • 您确实可以使用协议(protocol)。

  • 最佳答案

    NSObjectProtocol 不继承自 Hashable 。这就是这里的关键问题。

    它实际上不能从 Hashable 继承,因为 Hashable 需要一个名为 hashValue 的方法,而 NSObjectProtocol 需要一个名为 hash 的方法。

    另一方面, NSObject 类可以同时实现 NSObjectProtocolHashable
    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/

    10-12 03:36