创建字典类

时间:2018-12-10 11:28:59

标签: ios swift

我正在编码一个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 个答案:

答案 0 :(得分:3)

更改

print(myDictionary["key1"])

收件人

print(myDictionary.dictionary["key1"])

答案 1 :(得分:1)

假设您要创建自定义词典,因为您想检查(也许将来)要添加为键对的值是否可接受。

无论如何,如果您想让自定义词典类充当系统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

答案 2 :(得分: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"]!)