【问题标题】:Dictionary Not Working Properly字典无法正常工作
【发布时间】:2015-11-04 22:58:56
【问题描述】:

我一直在我的代码中使用字典,它们的工作方式都符合我对这本字典的期望:

switchState["index"+("\(cellNumber)")] = cellNumber

这是for in里面的cellNumber是变量之一。 cellNumber 代表用户打开的UISwitch

这本字典继续覆盖自己,我不知道为什么。 "index"+("\(cellNumber)") 应该给字典一个新的键来存储cellNumber 对吗?

我正在尝试将其作为NSDictionary 存储到NSUserDefaults 中,并且swift 让我有一个String 作为密钥,否则它不会存储它。因此,当我确实存储 Dictionary 时,只存在一个值。您能看到上述Code 的问题吗,或者有其他方法可以做到这一点。

感谢您的帮助。

【问题讨论】:

    标签: swift uitableview cocoa-touch swift2


    【解决方案1】:
    // Dictionaty<key,Value>
    // subscript(key: Key) -> Value?
    // key can be Int, Double, String .... any Type: Hashable
    // value can be Any (any number, string, struct, enumeration .... class)
    
    var dict: Dictionary<Int,Int> = [1:1]
    
    //  key    value
    dict[10] = 100
    dict[1] = 64364
    dict[76575] = 1
    
    dict.forEach { (key, value) -> () in
        print("storage for key: \(key) has value: \(value)")
        /*
        storage for key: 76575 has value: 1
        storage for key: 1 has value: 64364
        storage for key: 10 has value: 100
        */
    }
    
    var dict2 = [1:"alfa",2:"beta",3:"game"] // [2: "beta", 3: "game", 1: "alfa"]
    
    dict2.forEach { (key, value) -> () in
        print("storage for key: \(key) has value: \(value)")
        /*
        storage for key: 2 has value: beta
        storage for key: 3 has value: game
        storage for key: 1 has value: alfa
        */
    }
    let key = 2
    dict2.updateValue("HELLO", forKey: key) // returns string "beta" (old stored value)
    print("now the value for key \(key) has value:", dict2[key])
    /*
    now the value for key 2 has value: Optional("HELLO")
    
    why Optional?
    */
    print("the value for key \(-3) has value:", dict2[-3])
    /*
    the value for key -3 has value: nil
    
    How to remove value?
    */
    dict2.removeValueForKey(1)  // returns string "alfa" (old value)
    dict2[1]                    // return nil, as expected
    

    您必须将开关的值保存为 Bool 对于键 cellNumber 为 String

    var dict: [String:Bool] = [:]
    for i in 10...15 {
        let j = i % 3
        dict.updateValue(j == 0, forKey: "switch\(i)")
    }
    print(dict)
    /*
    ["switch12": true, "switch13": false, "switch11": false, "switch14": false, "switch10": false, "switch15": true]
    */
    

    【讨论】:

    • 感谢您的解释我知道字典几乎可以是任何东西。但我专门谈论的是保存到NSUserDefaults。在 Swift 中,当你想将 NSDictionary 保存到 NSUserDefaults 时,它只能处理 [String : AnyObject?]。此外,我在表中有多个开关,它们的索引都不同。因此,如果我可以将index ie. cellNumberswitch 的状态存储在字典中,然后将其存储到NSUserDefaults,这将解决我的问题。我会尝试你的最后一个建议,让你知道。谢谢。
    • 你的麻烦是你把 (key,value) 保存为 (key,key) dict["(key)"] = key.但您需要像 dict["(key"] = value as WhatEverYouNeed 一样将其保存为对 NSUserDefaults 有效。
    • 所以我像这样switchState[("\(cellNumber)")] = true 保存它,但它仍然每次都会覆盖自己。我在字典上调用.count 以确保它正确复制,但每次都只有 1 号。有什么想法吗?
    • 感谢您的解释我明白我现在必须做什么谢谢。
    【解决方案2】:

    首先,代码可以简化为:

    swiftchState["index\(cellNumber)"] = cellNumber
    

    您应该检查每个循环的 cellNumber 值是否发生变化。

    【讨论】:

    • @Si_Te_Feng 感谢您的简化。我想知道你是否知道为什么字典每次都会覆盖自己?我知道它没有正确复制,因为我尝试了switchState.count,它总是返回 1。任何想法。
    • 您确定每个循环的 cellNumber 都不同吗?
    • @Si_Te_Feng 我做到了,而且做到了。感谢您的帮助,我发现了问题。
    猜你喜欢
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多