NSObject是Hashable但是采用NSObject的协议不是吗?

Teo*_*ori 6 protocols objective-c hashable swift

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

在.h Obj-C文件中:

@protocol myProto <NSObject> 
@end
Run Code Online (Sandbox Code Playgroud)

在.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]?
}
Run Code Online (Sandbox Code Playgroud)

NSObject类的检验表明,它(或NSObjectProtocol它映射到)不执行由所述哈希的协议所需的散列值的方法,也没有明确地通过.

所以,在幕后的某个地方,尽管如此,NSObject仍被标记为Hashable,但不会扩展到采用NSObject/NSObjectProtocol的协议.

我有错误或错过了什么吗?

:) Teo

附加信息:

文件表明:

  • 字典的密钥类型的唯一要求是它是Hashable并且它实现了==.
  • 你确实可以使用协议.
字典键类型的哈希值

类型必须是可散列的才能用作字典的键类型 - 也就是说,类型必须提供计算自身散列值的方法.散列值是一个Int值,是对于比较相等的所有对象中,相同的,使得如果一个== B,它遵循a.hashValue == b.hashValue.

所有斯威夫特的基本类型(如字符串,整数,双精度和布尔)的默认情况下可哈希的,而所有这些类型的可以作为一个字典的键.默认情况下,没有关联值的枚举成员值(如枚举中所述)也是可清除的.

注意您可以使用自己的自定义类型作为字典键类型,使其符合Swift标准库中的Hashable协议.符合所述哈希的协议类型必须提供一个gettable int属性称为散列值,并且还必须提供"等于"运算符(==)的实现.类型的hashValue属性返回的值在同一程序的不同执行或不同程序中不需要相同.有关符合协议的更多信息,请参阅协议.

Sul*_*han 10

NSObjectProtocol不继承自Hashable.这是至关重要的问题.

它实际上不能继承,Hashable因为Hashable需要一个被调用的方法,hashValue同时NSObjectProtocol需要一个被调用的方法hash.

另一方面,NSObject类可以实现NSObjectProtocolHashable.

同样的问题发生在Equatable.

编辑:

还有一个更微妙的问题.您不能在Equatable预期的某个地方使用协议,您总是需要使用类类型或采用的值类型Equatable.原因是密钥的采用还不够,Equatable字典中的所有密钥必须彼此相等.

例如,如果您有一个类A和一个类B,两者都符合Equatable,那么您可以将实例A与其他实例进行A比较,并且您可以将实例B与其他实例进行B比较,但您无法比较实例的A实例B.这就是为什么你不能在同一个字典中使用AB键实例的实例.

请注意,每个NSObject都与其他任何内容相同NSObject,因此NSObject字典中键的允许类型也是如此.