cluster1 Asked: 2025-01-01 17:49:25 +0800 CST2025-01-01 17:49:25 +0800 CST 2025-01-01 17:49:25 +0800 CST 当对象可识别时,Hashable 的用途是什么? 772 我在 Paul Hudson 的一个视频中看到过这段代码。只有会员才能访问,但以下是相应的文本:编码挑战 struct Friend: Hashable, Identifiable, Codable { let id: UUID /* ... */ } 我知道 Hashable 是 identifiable 的替代方案,当您想使用带有列表/ForEach 的对象并且该对象没有 ID 而您不想添加它时。 同时拥有(可哈希和可识别)的目的是什么? swift 2 个回答 Voted Sweeper 2025-01-01T20:52:52+08:002025-01-01T20:52:52+08:00 Hashable当然不是 的“替代品” Identifiable。它们完全不同。id所需的属性Identifiable需要属于某种Hashable类型,但这并不意味着所有Identifiable事物也都是Hashable。这些协议意味着不同的东西。 您遵守这些规定Identifiable以便能够区分该类型的不同实例。 您遵守规定Hashable,以便可以比较该类型的两个实例是否彼此相等,并且还可以提供一个哈希值,可将其用作键Dictionary等。 “身份”不同于“平等”,两者并不一定相等。如果我有两个Banknotes 值,它们可能都是一张美元钞票(平等),但它们仍然是两张不同的美元钞票(不同的身份)。如果我有一个Friend,但他们后来改了名字,他们就不再是过去的自己(不平等),但他们仍然是同一个朋友(身份)。 更哲学地说,“身份”就像忒修斯之船。当你更换船的某些部分时,它显然会变得不同(不平等),但它还是同一艘船吗?这就是在问这艘船是否保持了它的“身份”。 因此,同时符合Hashable和Identifiable仅意味着此类型的值可以相互比较是否相等,并且还有一种方法可以区分实例。对于某些类型,相等可能等同于相同(例如,您可能希望具有enum固定数量案例的简单 s 具有此属性),但一般来说情况并非如此。 在 SwiftUI 的上下文中,Hashable/Equatable表示在视图更新期间,SwiftUI 可以比较您的视图,并避免body在没有任何变化的情况下不必要地调用您的视图。某些 APINavigationLink.init特别需要一个Hashable值,大概是因为作为一种实现,该值可能存储在哈希表或类似的东西中。 Best Answer malhal 2025-01-01T20:52:16+08:002025-01-01T20:52:16+08:00 我猜 Paul HudsonHashable在执行以下操作时添加了一个解决编译器错误的解决方法: NavigationLink(value: friend) 但他应该做的是: NavigationLink(value: friend.id) 原因是.navigationDestination应该通过 ID 从模型中检索好友,以维护 SwiftUI 使用的单一真实来源设计。即它不应该在导航路径中拥有好友的副本,这会导致潜在的一致性错误。
Hashable
当然不是 的“替代品”Identifiable
。它们完全不同。id
所需的属性Identifiable
需要属于某种Hashable
类型,但这并不意味着所有Identifiable
事物也都是Hashable
。这些协议意味着不同的东西。您遵守这些规定
Identifiable
以便能够区分该类型的不同实例。您遵守规定
Hashable
,以便可以比较该类型的两个实例是否彼此相等,并且还可以提供一个哈希值,可将其用作键Dictionary
等。“身份”不同于“平等”,两者并不一定相等。如果我有两个
Banknote
s 值,它们可能都是一张美元钞票(平等),但它们仍然是两张不同的美元钞票(不同的身份)。如果我有一个Friend
,但他们后来改了名字,他们就不再是过去的自己(不平等),但他们仍然是同一个朋友(身份)。更哲学地说,“身份”就像忒修斯之船。当你更换船的某些部分时,它显然会变得不同(不平等),但它还是同一艘船吗?这就是在问这艘船是否保持了它的“身份”。
因此,同时符合
Hashable
和Identifiable
仅意味着此类型的值可以相互比较是否相等,并且还有一种方法可以区分实例。对于某些类型,相等可能等同于相同(例如,您可能希望具有enum
固定数量案例的简单 s 具有此属性),但一般来说情况并非如此。在 SwiftUI 的上下文中,
Hashable
/Equatable
表示在视图更新期间,SwiftUI 可以比较您的视图,并避免body
在没有任何变化的情况下不必要地调用您的视图。某些 APINavigationLink.init
特别需要一个Hashable
值,大概是因为作为一种实现,该值可能存储在哈希表或类似的东西中。我猜 Paul Hudson
Hashable
在执行以下操作时添加了一个解决编译器错误的解决方法:但他应该做的是:
原因是
.navigationDestination
应该通过 ID 从模型中检索好友,以维护 SwiftUI 使用的单一真实来源设计。即它不应该在导航路径中拥有好友的副本,这会导致潜在的一致性错误。