首页 文章

创建Dictionary类

提问于
浏览
-1

我正在编写一个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

3 回答

  • 1

    更改

    print(myDictionary["key1"])
    

    print(myDictionary.dictionary["key1"])
    
  • 3

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

    无论如何,如果你想让一个自定义字典类充当系统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)
    }
    

    如果你真的想以你提到的方式获得它的 Value 's not working, you' ll需要实现 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

  • 0

    为了能够使用您的语法添加密钥订阅支持(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"]!)
    

相关问题