【问题标题】:Swift Dictionary access value using key within extensionSwift Dictionary 使用扩展中的键访问值
【发布时间】:2017-04-29 06:02:22
【问题描述】:

事实证明,在 Dictionary 扩展中,下标是毫无用处的,因为它表示 Ambiguous reference to member 'subscript'。看来我要么必须做 Swift 在其 subscript(Key) 中所做的事情,要么调用一个函数。有什么想法吗?

例如,

public extension Dictionary {
    public func bool(_ key: String) -> Bool? {
        return self[key] as? Bool
    }
}

行不通,因为据说下标不明确。

添加我的误解来自于我认为KeyAssociatedType 而不是通用参数。

【问题讨论】:

  • 好了,现在人们有事情要做了
  • @AlexanderMomchliov 老实说,我认为示例代码与我解释的内容没有什么不同,但我想它使问题更容易理解。
  • 它消除了猜测工作,并避免我们浪费时间进行可比较的测试设置
  • 另外,请记住,我们经常看到人们带着问题来到这里,按照他们的想法描述他们的代码,经过一些乏味的来回后,我们发现实际上并非如此

标签: swift dictionary hashtable extension-methods subscript


【解决方案1】:

Swift 类型Dictionary 有两个泛型参数KeyValue,而Key 可能不是String

这行得通:

public extension Dictionary {
    public func bool(_ key: Key) -> Bool? {
        return self[key] as? Bool
    }
}

let dict: [String: Any] = [
    "a": true,
    "b": 0,
]
if let a = dict.bool("a") {
    print(a) //->true
}
if let b = dict.bool("b") {
    print(b) //not executed
}

对于添加部分。

如果您在Dictionary 的扩展中引入新的通用参数T,则该方法需要适用于Key(:Hashable)、ValueValue 的所有可能组合 T(:Hashable)。 KeyT 可能不是同一类型。

(例如,Key 可能是 StringT 可能是 Int(两者都是 Hashable)。你知道当 KeyString 时,你不能用 Int 下标。)

因此,您不能使用 key 类型的 T 下标。


对于更新的添加部分。

似乎是一个合理的误解。而且您找到了一个很好的例子,它解释了具有关联类型的协议不仅仅是一个通用协议。

【讨论】:

  • 是的,我明白了。这就是为什么返回类型首先是Bool?。例如var dic: [AnyHashable: Any] = ["1": 1]; print(dic[1]) 给出nilKey 必须是 HashableString 符合。
  • 那又怎样? String 符合 Hashable 并不意味着 Key 始终是 String
  • 好吧,我的函数指定密钥始终是String
  • 那么为什么它不起作用? Key: Hashable 是字典要求的。函数的参数严格限制为String,即Hashable
  • 您正在为一般Dictionary 编写扩展,而不是为Dictionary<String, SomeType>。字典可能接受String,也可能不接受String。你的扩展如何为[Int: Int] 工作?
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多