【问题标题】:create Dictionary class创建字典类
【发布时间】:2018-12-10 11:28:59
【问题描述】:

我正在编写一个 Swift 类,它在实例化它时构建一个字典,加上添加键值对的可能性,但是一旦完成,问题是我无法访问我添加的各个对,所以肯定有问题我无法检测到的地方,请帮助

class MyDictionary {

var dictionary = ["":""]

init() {
}

func addPair(key: String, value: String) {
    //dictionary["key"] = "value"
    dictionary.updateValue(value, forKey: key)
}

}

// just to compare... this one works
    var dict = ["one": "abc"]
    dict["two"] = "efg"
    print(dict["two"]!)

    let myDictionary = MyDictionary()
    myDictionary.addPair(key: "key1", value: "value1")
    print(myDictionary)

    //print(myDictionary["key1"])  //Does not work

【问题讨论】:

  • dictionary["key"] = "value" 这会起作用。
  • 它不应该工作,因为 myDictionary 是 Class 类型而不仅仅是 Swift Dictionary

标签: ios swift


【解决方案1】:

改变

print(myDictionary["key1"])

print(myDictionary.dictionary["key1"])

【讨论】:

    【解决方案2】:

    我假设您想创建一个自定义字典,因为您想检查(可能在将来)作为密钥对添加的值是否可以接受。

    无论如何,如果您想拥有一个自定义字典类来充当系统 Dictionary 类的包装器,我建议将字典 property 设为私有(这样外人就无法直接访问和修改它),并且添加额外的方法来获取键的值(如果存在这样的键):

    class MyDictionary {
    
        private var dictionary = ["":""]
    
        init() {
        }
    
        func addPair(key: String, value: String) {
            dictionary.updateValue(value, forKey: key)
        }
    
        func valueForKey(_ key: String) -> String? {
            if let valueForKey = dictionary[key] {
                return valueForKey
            }
            return nil
        }
    }
    

    这是你将如何使用它:

    let myDictionary = MyDictionary()
    myDictionary.addPair(key: "key1", value: "value1")
    
    if let valueForKey = myDictionary.valueForKey("key1") {
        print(valueForKey)
    }
    

    如果你真的想以你提到的方式获得价值,它不起作用,你需要实现一个subscript,因为 MyDictionary 是一个自定义类,还没有:

    class MyDictionary {
    
        private var dictionary = ["":""]
    
        /* more code */
    
        func valueForKey(_ key: String) -> String? {
            if let valueForKey = dictionary[key] {
                return valueForKey
            }
            return nil
        }
    
        subscript(_ key: String) -> String? {
            get {
                return valueForKey(key)
            }
        }
    }
    

    这是你将如何使用下标:

    let myDictionary = MyDictionary()
    myDictionary.addPair(key: "key1", value: "value1")
    
    if let valueForKey = myDictionary["key1"] {
        print(valueForKey)
        print(myDictionary["key1"]!)
    }
    

    请注意,myDictionary["key1"] 返回一个Optional StringString?,因此您必须强制解开该值以使print() 方法不抱怨。由于我们在 if let 语句中执行此操作 - 我们知道 myDictionary["key1"] 不是 nil,并且 myDictionary["key1"]! 必须是一些有效的 String 对象。

    在此处查看更多信息:https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html

    【讨论】:

      【解决方案3】:

      为了能够使用您的语法添加密钥订阅支持(getter 和 setter)。

      class MyDictionary {
      
          var dictionary = ["":""]
      
          init() {
          }
      
          func addPair(key: String, value: String) {
              dictionary.updateValue(value, forKey: key)
          }
      
          subscript(_ key: String) -> String? {
              get { return dictionary[key] }
              set { dictionary[key] = newValue }
          }
      }
      
      let myDictionary = MyDictionary()
      myDictionary.addPair(key: "key1", value: "value1")
      print(myDictionary["key1"]!)
      

      您可以将类扩展为泛型以将其用于不同的类型。订阅设置器使addPair 变得多余。

      class MyDictionary<K : Hashable, V> {
      
          var dictionary = [K:V]()
      
          subscript(_ key: K) -> V? {
              get { return dictionary[key] }
              set { dictionary[key] = newValue }
          }
      }
      
      let myDictionary = MyDictionary<String,String>()
      myDictionary["key1"] = "value1"   
      print(myDictionary["key1"]!)
      

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 2017-01-08
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 2019-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多