【问题标题】:Trouble accessing dictionary item in Swift 2.0在 Swift 2.0 中访问字典项目时遇到问题
【发布时间】:2015-11-28 16:16:52
【问题描述】:

我在 Obj-C 方面经验丰富,但对 Swift 很陌生。我有一个简单的函数,它以 Set 和 Dictionary 作为参数:

func buildSource(dataToParse:Set<String>, lookupData:Dictionary<String,AnyObject>) {
    for item in dataToParse {
        for dict in lookupData {
            let nameID = dict["name"] // compile error
        }
    }
}

传入的参数lookupData是一个包含嵌套字典的字典。我知道这些字典中的每一个都包含一个名为 name 的键,但是当我尝试使用以下语法访问该键时:

let nameID = dict["name"]

我收到以下comile错误:

Type '(String, AnyObject)' has no subscript members

如果我知道某个密钥存在,我该如何访问它?谢谢!

【问题讨论】:

    标签: swift dictionary swift2


    【解决方案1】:
    import Foundation
    
    func buildSource(dataToParse:Set<String>, lookupData:Dictionary<String,AnyObject>)->[AnyObject] {
        var ret: Array<AnyObject> = []
        for item in dataToParse {
            for (key, value) in lookupData {
                if key == item {
                    ret.append(value)
                }
            }
        }
        return ret
    }
    
    let set = Set(["alfa","beta","gama"])
    var data: Dictionary<String,AnyObject> = [:]
    data["alfa"] = NSNumber(integer: 1)
    data["beta"] = NSDate()
    data["theta"] = NSString(string: "some string")
    
    let find = buildSource(set, lookupData: data)
    dump(find)
    
    /* prints
    ▿ 2 elements
    - [0]: 28 Nov 2015 18:02
    ▿ [1]: 1 #0
    ▿ NSNumber: 1
    ▿ NSValue: 1
    - NSObject: 1
    */
    

    在您的代码中

    for dict in lookupData {
        let nameID = dict["name"] // compile error
    }
    

    dict 不是字典,而是 (key, value) 元组!

    【讨论】:

    • @R Menke 没关系,他可以继续更进一步,如他所愿。你知道,字典上的地图为你提供了键值对数组。 x in ... forEach .. 等
    • @RMenke 他只是暂时没有使用物品(来自他的套装)。 “name”是他的lookupData(字典)中的字符串键。 for dict in lookupData 给你 (key, value) pair 。如果 value 是另一个字典,你可以继续深入
    • @R Menke 顺便说一句,swift Dictionary 不符合 AnyObject 协议,也许更深层次的是一些 NSDictionary ...
    【解决方案2】:

    更新:

    • lookupData 获取值,"name" 作为key
    • 向下转换到带有as? [String:AnyObject] 的字典
    • 遍历dataToParse
    • 使用dataToParse 中的String 访问嵌套字典。

    func buildSource(dataToParse:Set<String>, lookupData:[String:AnyObject]) {
    
        guard let dict = lookupData["name"] as? [String:AnyObject] else {
            return
        }
    
        for item in dataToParse {
            let value = dict[item]
        }
    }
    

    更多可能的解决方案:

    如果lookupData 是一个字典数组:

    func buildSource(dataToParse:Set<String>, lookupData:[[String:AnyObject]]) {
        for item in dataToParse { // String
            for dict in lookupData { // dict
                let nameID = dict["name"] // value
            }
        }
    }
    

    如果 lookupData 是嵌套字典:

    func buildSource(dataToParse:Set<String>, lookupData:[String:[String:AnyObject]]) {
        for item in dataToParse {
            guard let dict = lookupData[item] else {
                continue
            }
            guard let nameID = dict["name"] else {
                continue
            }
        }
    }
    

    如果lookupData 肯定是[String:AnyObject] 并且它的值可能是另一个[String:AnyObject],但也可能不是。

    func buildSource(dataToParse:Set<String>, lookupData:[String:AnyObject]) {
        for item in dataToParse {
            guard let dict = lookupData[item] as? [String:AnyObject] else {
                continue
            }
            guard let nameID = dict["name"] else {
                continue
            }
        }
    }
    

    【讨论】:

    • 没有。集合中的每个字符串都应显示为“item”引用的字典中“name”键的值
    • 是的,lookupData 是一个字典集合,每个字典都有一个“名称”键
    • @Pheepster 那么你的lookupData 肯定有错误的类型。你也没有在任何地方使用item
    • 没错,我还没有使用项目。我需要在我试图使用 dict["name"] 获取的字典中查找 item 的值。 'name' 键将包含存储在 item 中的值
    • @Pheepster 更新了“'name' 键将包含存储在 item 中的值”这对我来说意义不大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多