2016-02-19 42 views
-7

测试字典声明:的NSDictionary与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
乙 - >用户名BBB,ABC

+1

转到“字典”。该文档使用示例和一切:) https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes。HTML – boidkan

+1

也是真的不是一个NSDictionary – boidkan

回答

1
for group in data { 
    let userNames = group.1.reduce("username ", combine: { (current, userInfo) -> String in 
     return "\(current), \(userInfo["username"]!)" 
    }) 

    print("\(group.0) \(userNames)") 
} 
+0

谢谢你的回答,我还有一个问题,答:用户名AAA用户名1,用户名ABB用户名2我们该怎么做 – pirpirim

+0

@pirpirim再问一个问题。 – tktsubota

3

键 - 值编码是你的朋友:

let usernamesA = (data["A"]! as NSArray).valueForKey("username") 
let usernamesB = (data["B"]! as NSArray).valueForKey("username") 
+0

谢谢你的回答,我有一个问题, 答:用户名AAA用户ID 1,用户名ABB用户ID 2 我们如何做到这一点 – pirpirim

+0

这是超越了技能关KVC – vadian

+0

所以我们必须使用什么方法? – pirpirim

0

你可以找到在“字典”下的Swift here中的字典文档。

因此对于本字典:

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"]你这样做的价值:如果您想为重点username你会做访问值

data["A"] 

这个。

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

如果你正在处理一个NSDictionary,希望在NSDictionary进入嵌套值时KVC方法.valueForKey另一种是.valueForKeyPath,非常有用。

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"]] 
] 

为了回答您的其他问题

要vadian:的答案,你写道:

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

A: username AAA userid 1 , username ABB userid 2 

可以解决这个例如利用zip结合上面使用的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 
相关问题