NSDictionary with swift



测试字典声明:

var data = [
            "A": [["userid":"1","username":"AAA","usergroupid":"2"], ["userid":"33","username":"ABB","usergroupid":"8"]],
            "B": [["userid":"2","username":"BBB","usergroupid":"8"], ["userid":"43","username":"ABC","usergroupid":"8"]]
           ]

如何获得以下输出?

例如:
A ->用户名 AAA , ABB
B ->用户名 BBB , ABC

键值编码是你的朋友:

let usernamesA = (data["A"]! as NSArray).valueForKey("username")
let usernamesB = (data["B"]! as NSArray).valueForKey("username")
for group in data {
    let userNames = group.1.reduce("username ", combine: { (current, userInfo) -> String in
        return "(current), (userInfo["username"]!)"
    })
    print("(group.0) (userNames)")
}

如果你正在处理一个NSDictionary.valueForKeyPath 是 KVC 方法.valueForKey的替代方案,当想要在NSDictionary中输入嵌套值时很有用。

let foo : (NSDictionary, String) -> (String?) = { 
    ($0.valueForKeyPath($1+".username") as? NSArray)?.reduce($1+" ->") {$0+" "+($1 as! String)}
}
print(foo(data, "A") ?? "Key not found") // A -> AAA ABB
print(foo(data, "B") ?? "Key not found") // B -> BBB ABC
print(foo(data, "C") ?? "Key not found") // Key not found

使用data

var data : NSDictionary = [
    "A": [["userid":"1","username":"AAA","usergroupid":"2"], ["userid":"33","username":"ABB","usergroupid":"8"]],
    "B": [["userid":"2","username":"BBB","usergroupid":"8"], ["userid":"43","username":"ABC","usergroupid":"8"]]
]

回答您的其他问题

对于瓦迪安的回答,你写道:

"谢谢你的回答,我还有一个问题,

A: username AAA userid 1 , username ABB userid 2

"

您可以解决此问题,例如将zip与上面使用的.valueForKeyPath KVC技术结合使用。一个解决方案如下

let bar : (NSDictionary, String) -> (String?) = {
    dict, key in
    guard let 
        uName = ((dict.valueForKeyPath(key+".username") as? NSArray)?.map { String($0) }),
        uId = ((dict.valueForKeyPath(key+".userid") as? NSArray)?.map { String($0) }) else {
        return nil
    }
    var foo = Array(zip(uName,uId)).reduce(key+": ") { $0 + "username: " + $1.0 + " userid: " + $1.1 + ", " }
    foo.removeRange(foo.endIndex.advancedBy(-2)..<foo.endIndex)
    return foo
}
print(bar(data, "A") ?? "Key not found")
    // A: username: AAA userid: 1, username: ABB userid: 33
print(bar(data, "B") ?? "Key not found")
    // B: username: BBB userid: 2, username: ABC userid: 43
print(bar(data, "C") ?? "Key not found")
    // Key not found

您可以在 "Dictionaries" 下找到 Swift 中有关字典的文档。

所以对于这个词典:

var data = [
        "A": [["userid":"1","username":"AAA","usergroupid":"2"], ["userid":"33","username":"ABB","usergroupid":"8"]],
        "B": [["userid":"2","username":"BBB","usergroupid":"8"], ["userid":"43","username":"ABC","usergroupid":"8"]]
       ]

如果要获取值[["userid":"1","username":"AAA","usergroupid":"2"]请执行以下操作:

data["A"]

如果要访问键的值username请执行此操作。

data["A"]!["username"] //which equals "AAA"

最新更新