测试字典声明:
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"