【问题标题】:Compound type as Swift dictionary key? [duplicate]复合类型作为 Swift 字典键? [复制]
【发布时间】:2016-09-26 11:35:24
【问题描述】:

我有一个案例,我想将值存储在字典中,键是字符串序列。

例如,在 Python 中,我只使用一个元组:

foo = {('a', 'b', 'c'): 10}

不过,在 Swift 中,字典键必须是可散列的,而元组(即结构)则不是。数组也不是。 (我知道这一点,因此,这与“在 Swift 中我可以使用元组作为字典中的键吗?”问题不同。答案显然是否定的。)

我可以编写自己的 class ListOfStrings: Hashable 类,它只是一个 [String],有自己的哈希码,但这似乎是我不应该用高级语言做的事情。

我可以使用 NSDictionary/NSArray,但这似乎也是一个尴尬的解决方案。另外,NSArray 的哈希码只是它的长度,这对性能没有好处。

在 Swift 中有没有更好的方法来做到这一点?

【问题讨论】:

  • NSMutableSetNSSet 可以工作吗?
  • l'L'l:你的意思是作为一把钥匙吗?除了丢失我的字符串的顺序之外,这似乎与 NSArray 一样存在所有问题,包括使用大小作为哈希码:opensource.apple.com//source/CF/CF-635.19/CFBasicHash.m
  • 是的,如果不对它做一些骇人听闻的事情,它可能不会按照你想要的方式工作。 NSSet 通常更快,但通过 NSArray 检查其中的成员对象。
  • appzYourLife:我不认为它是重复的。这个问题问“你能吗?” (答案是“否”)。这个问题是“我知道这件事是不允许的,那么解决它的常规方法是什么?”

标签: swift dictionary


【解决方案1】:

您可以将字符串列表更改为字符串的串联,而不是使用:

foo ["a","b","c"] = someInteger

你可以简单地写成:

foo ["a"+"b"+"c"] = someInteger

然后字典只是使用字符串作为键,我猜你的代码的其余部分不需要改变。您必须小心处理正在使用的字符串,以确保您始终拥有唯一的密钥,但我觉得您已经掌握了这一点。

【讨论】:

  • 我不能保证我的字符串的值,这将散列 ("a", "bc")("ab", "c") 相同。是否有一些字符值可以放入不是有效 Unicode 字符的 Swift 字符串中,可以用作分隔符?
  • 在不了解数据结构内容的完整上下文的情况下很难回答。我认为字符串中的所有字符都必须是 unicode,但可能有一些你知道输入字符串中不会出现的东西(例如和表情符号)可以使用。一个想法:如果您无法控制字符串,您将需要做一些事情来确保每个集合都是唯一的 - 也许您可以将上述问题的解决方案合并到该过程中。
  • 另一个问题是性能。我可以与"|" 一起加入他们,如果该字符出现在输入中,则通过将其翻倍来转义它,这将是安全的。缺点是这意味着对于每个键,而不是只存储对现有字符串的引用,我需要构建一个比所有字符串加在一起更长的全新字符串。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2011-02-22
  • 2012-11-11
  • 1970-01-01
相关资源
最近更新 更多