【问题标题】:Access to key inside Dictionary get in Swift在 Swift 中访问 Dictionary 中的密钥
【发布时间】:2020-07-31 19:58:03
【问题描述】:

是否可以在 Swift 中访问 Dictionary get 内的键?

主要思想是:

在这段代码中

var _dict:[String:String]  = [:]

var dict:[String:String] {
    
    //get the key
    
    return _dict

}

_dict = ["key 1":"Value 1","key 2":"Value 2"]

print(dict["key 1"])

访问该键以检查该值是否存在,如果存在则返回该值,如果不生成该键的值

【问题讨论】:

  • 我确定这是可能的(这是subscript 函数),但不清楚您期望的界面。你在这里给出的例子只是返回"Value 1"。你在想什么?
  • 我的想法是验证返回值在get中是否有效
  • 如果它无效?在这种情况下什么是“有效的”? nil 是要返回的有效值。你在期待什么?
  • 如果键存在,则返回值,否则为该键生成值
  • “产生价值”是什么意思?是否有一些函数可以生成这些值?忘记字典。想想func something(string: String) -> String。你将如何实施它?字典只是围绕它的语法糖。

标签: ios swift dictionary


【解决方案1】:

您是否知道Dictionary 允许您在其下标中指定默认值以避免处理可选值。它是这样工作的:

let dict = ["a": 1, "b": 2]
let c = dict["c", default: 3] 

print(c) // 3

但这不会改变字典 - 它仍然只有 "a""b" 键,这是预期的行为。

我认为您要问的是是否可以使用默认值来改变字典。答案是肯定的 - 您可以使用 mutating get 创建一个下标。

但这是错误的做法!

您将有效地获得具有副作用的吸气剂,这通常是一种不好的做法。

无论如何,这就是您可以使用新参数setDefault 实现下标的方法:

extension Dictionary {
   subscript(key: Key, setDefault defaultVal: @autoclosure () -> Value) -> Value {
      mutating get {
         if let val = self[key] { 
            return val 
         } else {
            let val = defaultVal()
            self[key] = val
            return val
         }
      }
   }
}
// dict needs to be a var now
var dict = ["a": 1, "b": 2]
let c = dict["c", setDefault: 3]

现在,dict 将发生变异,变为 ["a": 1, "b": 2, "c": 3]

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2013-10-24
    相关资源
    最近更新 更多