【问题标题】:Can you use Arrays as keys in Dictionaries?你可以使用数组作为字典中的键吗?
【发布时间】:2014-11-17 04:03:43
【问题描述】:

我最初有一个我认为是唯一的字符串列表,因此我构建了一个字典并将该字符串列表用作值。 示例:[contact1,contact2,contact3]

但是,我意识到字符串不是唯一的,但是 2 个字符串的组合是唯一的。 示例:`[[contact1,contact1],[contact1,contact2],[contact2,contact2]...]

既然我有 2 个唯一的对象,我想将它们用作字典键,我可以使用字符串数组作为字典键吗?

假设我不能,如果我的字符串不包含逗号,我想我可以合并它们并用逗号分隔。坏主意?

【问题讨论】:

  • 你试过了吗?先尝试比发布问题要好得多。
  • 如果你尝试过,那么你应该知道它是否有效。如果你知道,为什么要发布这个问题?我真的很想理解这个问题。

标签: ios dictionary swift


【解决方案1】:

是的:

let x = [["a1", "a2"]:"1", ["b1", "b2"]:"2"]
println("x: \(x)")

let v = x[["a1", "a2"]] as String
println("v: \(v)")

输出:

X: { ( b1, b2 ) = 2; ( 一个, a2 ) = 1; } 五:1

【讨论】:

  • 检查x 上的类型:因为Objective-C 桥接,这会给你一个NSDictionary,而不是Swift Dictionary
【解决方案2】:

您可以使用任何 Hashable 类型作为字典键——Swift 的内置 Array 类型不可散列,但由于 NSObject 是可散列的,并且 Swift 数组静默桥接至 Objective-C 数组,您可以无意中使用了NSArray 作为键。

【讨论】:

  • 是的,正确但是:“那又怎样?”真的没有“Pure Swift”这样的东西,至少现在还没有,基础的Foundation类仍然是必要的,像NSData这样的真正的基础类。 Swift 团队在 Swift 语言中构建了这种桥接,所以我认为没有理由不使用它。我不需要关心内部实现细节。
  • 它们是不同的类型,应该准确地说明我们正在处理的内容。我并不是说使用 Foundation 类是不合适的,但是在没有意识到你正在做的事情的情况下使用它们可能会给你带来麻烦。
  • Swift 通过设计隐藏了该细节,因此它是一个实现细节。关于桥接到 CFString 或类集群中的几个底层具体类中的任何一个,人们可以说同样的话。至于“未来的麻烦”,Apple 应该在文档中警告有关自动带来的信息——但他们没有。也许是 String 不完整的问题,它不是可散列的类型。如果不想有两个字符串类,我的建议是使用 Objective-C。
  • 这不仅仅是一个实现细节——当你使用NSDictionary 时,你放弃了 Swift 的所有类型安全检查。同样,如果这是您想要的,那很好,但是您要注册自己,每次访问字典中的内容时都必须退出AnyObject。这就是为什么 as String 在你的代码中是必要的,如果你错了它会崩溃。
  • 听起来 Swift 还没有真正准备好,如果它会静默桥接到会崩溃的环境!但是 Swift 除了崩溃之外不会对数组边界进行安全检查,Xcode 建议通过添加“!”来修复 Optionals,显式展开会抛出安全检查。所以看起来争论的焦点是不要使用 Swift——至少现在是这样。
【解决方案3】:

我认为这是不可能的。

你可以使用contact1_contact1,contact1_contact2,contact2_contact2这样的字符串

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 2014-07-30
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多