- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想使用一个非常简单的元组作为键:
(Int, Int)
字典键需要是可哈希的。我学会了。
但找不到我如何使这个简单的元组可散列,并且在最好的时候确实在协议(protocol)一致性方面苦苦挣扎。
更深刻的是,CGPoint 可以解决我的问题。它可以是这种格式,但不可散列。
是否可以扩展 CGPoint 使其可散列?如果是,怎么办?
编辑:CGPoint 选择的 Int 变体的图像。
最佳答案
使类、结构或枚举符合Hashable
并不困难。您只需要显式声明符合 Hashable
并定义一个属性 hashValue: Int
。实际上,hashValue
需要满足一个简单的公理:if a == b then a.hashValue == b.hashValue。
(要符合Hashable
,您还需要使类型Equatable
。对于CGPoint
,它已经是Equatable
。)
使CGPoint
符合Hashable
的例子:
extension CGPoint: Hashable {
public var hashValue: Int {
//This expression can be any of the arbitrary expression which fulfills the axiom above.
return x.hashValue ^ y.hashValue
}
}
var pointDict: [CGPoint: String] = [
CGPoint(x: 1.0, y: 2.0): "PointA",
CGPoint(x: 3.0, y: 4.0): "PointB",
CGPoint(x: 5.0, y: 6.0): "PointC",
]
print(pointDict[CGPoint(x: 1.0, y: 2.0)]) //->Optional("PointA")
由于 CGPoint
包含 CGFloat
值,因此,CGPoint
作为 Dictionary 的 Key 可能会导致基于二进制浮点计算错误的意外行为-点系统。您需要格外小心地使用它。
添加
如果你想避免一些计算错误问题并且可以接受结构只能包含Int
,你可以定义自己的结构并使其符合Hashable
:
struct MyPoint {
var x: Int
var y: Int
}
extension MyPoint: Hashable {
public var hashValue: Int {
return x.hashValue ^ y.hashValue
}
public static func == (lhs: MyPoint, rhs: MyPoint) -> Bool {
return lhs.x == rhs.x && lhs.y == rhs.y
}
}
var myPointDict: [MyPoint: String] = [
MyPoint(x: 1, y: 2): "MyPointA",
MyPoint(x: 3, y: 4): "MyPointB",
MyPoint(x: 5, y: 6): "MyPointC",
]
print(myPointDict[MyPoint(x: 1, y: 2)]) //->Optional("MyPointA")
并不比上面的代码难多少,您还需要做的一件事就是为结构定义==
运算符。请尝试一下。
关于swift - 使简单元组符合 Hashable,因此可以是 Dictionary Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253306/
有没有人写过一个通用函数以便hash可以为自定义数据类型自动生成函数(使用 deriving 机制)?有几次,我写了以下样板, data LeafExpr = Var Name | Star deri
我们如何让 SwiftUI 对象,尤其是 Image,符合 Hashable 协议(protocol)? 我知道它们符合 Equatable 协议(protocol),所以主要问题是如何获取哈希值,或
我需要某种薄包装对象来标记字典键,例如: d = { Required('name'): str, Optional('age'): int, } 并且这些包装器的行为应该像被包装的对象(比较
我实现了下面的类: class Table : Hashable { var uid : Int var timeRemaining : Int? var curren
有时我编写的函数的参数可以是任何类型,只要它是 hashable。 - 例如,因为我的函数将其添加到集合中或将其用作字典键。 有没有一种方法可以使用 Python 3.5 中引入的 PEP 484 类
这个问题已经有答案了: Make struct Hashable? (2 个回答) 已关闭 5 年前。 我希望创建一个仅保存结构的唯一实例的数组: var vowelSet: Set 这是我的结构
protocol Component {} struct Container { let map: [Component: Component] } 在上面的代码中,如何指定 map 的键可以
我有一个自定义控件,它使用数据源来获取项目(就像 NSTableView 所做的那样)。数据源可以返回任何类型,只要它是可哈希的。这些项目用作私有(private)字典中的键。 控件(自定义 View
在 Hashable 内部我们可以看到: /// Hash values are not guaranteed to be equal across different executions of /
在 Xcode 10 和 Swift 4.2 中,还有其他类型符合 Hashable,只要它们的元素也符合 Hashable(Array 、字典等)。 我目前在我的项目中有一些代码为 Swift 4.
我想使用自定义枚举数组作为字典键,但我很难弄清楚如何使数组符合 Hashable。编译器告诉我 [Symbol] 不符合 Hashable。我需要做什么才能编译它? 我搞砸了对 Array 的扩展,其
假设我有一个名为 LivingCreature 的类以及继承自它的其他类: 人类 狗 外星人 这就是我想要完成的: let valueForLivingCreature = Dictionary 然后
我有一些结构符合的基本协议(protocol)(模型)。它们也符合 Hashable protocol Model {} struct Contact: Model, Hashable { v
考虑以下代码: #!/usr/bin/env python3.7 from typing import NamedTuple, Set class Person(NamedTuple): na
我有一个自定义的映射类,如下所示。 class UserSaved { var Id : String var UserName : String var
它在 java 中很容易完成 - 哈希码似乎是指向对象或其他东西的指针。为什么 swift 没有为我们提供同样的舒适感,而是要求我们自己定义函数? 最佳答案 哈希码似乎是指向对象或其他东西的指针。 在
我正在尝试在 Swift 中创建一个函数,它将一个字符串字典作为参数,并返回一个字符串元组。我希望字典中的键值对是可选的,因为如果它返回的元组中的值之一是“nil”,我不希望我的程序崩溃。 func
我正在尝试修复 RayWenderlich 网站上不再受支持的旧教程。该警告出现在三个文件中,Chain.swift、Cookie.swift 和 Swap.swift,来自“如何使用 SpriteK
如何在隐藏实现 Hashable 的具体类型的地方返回 [Hashable: Any]? Swift 有两种类型的协议(protocol):可以用作类型的协议(protocol)和只能用作类型约束的协
假设我有一个基类“Person”,我想将其添加到一个集合(列表)中,因此需要符合 Hashable 和 Equatable: class Person : Equatable, Hashable {
我是一名优秀的程序员,十分优秀!