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
附加信息:
该文件表明:
==.字典键类型的哈希值类型必须是可散列的才能用作字典的键类型 - 也就是说,类型必须提供计算自身散列值的方法.散列值是一个Int值,是对于比较相等的所有对象中,相同的,使得如果一个== B,它遵循a.hashValue == b.hashValue.
所有斯威夫特的基本类型(如字符串,整数,双精度和布尔)的默认情况下可哈希的,而所有这些类型的可以作为一个字典的键.默认情况下,没有关联值的枚举成员值(如枚举中所述)也是可清除的.
注意您可以使用自己的自定义类型作为字典键类型,使其符合Swift标准库中的Hashable协议.符合所述哈希的协议类型必须提供一个gettable int属性称为散列值,并且还必须提供"等于"运算符(==)的实现.类型的hashValue属性返回的值在同一程序的不同执行或不同程序中不需要相同.有关符合协议的更多信息,请参阅协议.
Sul*_*han 10
NSObjectProtocol不继承自Hashable.这是至关重要的问题.
它实际上不能继承,Hashable因为Hashable需要一个被调用的方法,hashValue同时NSObjectProtocol需要一个被调用的方法hash.
另一方面,NSObject类可以实现NSObjectProtocol和Hashable.
同样的问题发生在Equatable.
编辑:
还有一个更微妙的问题.您不能在Equatable预期的某个地方使用协议,您总是需要使用类类型或采用的值类型Equatable.原因是密钥的采用还不够,Equatable字典中的所有密钥必须彼此相等.
例如,如果您有一个类A和一个类B,两者都符合Equatable,那么您可以将实例A与其他实例进行A比较,并且您可以将实例B与其他实例进行B比较,但您无法比较实例的A实例B.这就是为什么你不能在同一个字典中使用A和B键实例的实例.
请注意,每个NSObject都与其他任何内容相同NSObject,因此NSObject字典中键的允许类型也是如此.
| 归档时间: |
|
| 查看次数: |
4600 次 |
| 最近记录: |