Swift中的Hashable OptionSet

2018年8月29日·2分钟阅读

这篇文章解释了如何在Swift中创建一个OptionSet,该OptionSet还实现了Hashable协议。 这样,它可以在字典中使用。 即使它非常简单,我也无法在线找到一个文档化的示例,因此我认为我可以将其组合在一起。

我最近一直在使用Apple的SpriteKit开发一款游戏,并达到了实现和跟踪游戏内成就的地步。 reddit上的一个用户建议使用OptionSet来存储已解锁的成就,并使用Dictionary作为各种“成就百科全书” ,这真是一个不错的建议! 为了使这项工作可行,OptionSet还必须实现Hashable协议。

为什么对我的用例有意义:

  • OptionSet使按位操作相对不费力,因此避免了头痛
  • 我没有计划大量的成就(限制是整数的位数)
  • 在UserDefaults中存储整数(OptionSet的rawValue)非常容易,而且存储效率高。
  • 需要hashValue整数作为唯一(理想情况下)分析哈希内容的方式
  • ==函数比较散列。

此实现使用OptionSet的rawValue作为唯一指示符。 由于hashValue符合rawValue ,因此它在==函数中使用。 这样,我们可以将责任整合到hashValue中 。 但是,您也可以返回:

 返回lhs.rawValue == rhs.rawValue 
  • 乔伊斯·马托斯(Joyce Matos)对Hashable的分解

最初在 nathanwillson.com上 发布