我在[[String : AnyObject]]
对象中有一个名为rooms
的字典User
数组 - 每个字典都包含一个名称作为字符串,一个id作为AnyObject。
我想用名称填充表视图,所以我试图遍历数组并从dicts中获取String值。
if let roomDict = myUser.rooms as? [[String : AnyObject]] {
for (roomNames, _) in roomDict {
cell.textLabel?.text = roomNames
}
}
我是相对较新的,从我在教程中看到的,当循环遍历词典时,你使用下划线来指定你不想要第二个值。因此,只需获取所有第一个值(在本例中为名称),并将它们设置为roomNames
变量。
但是我在这里很困惑,因为我没有循环遍历字典,我正在遍历一系列字典。所以我不知道该怎么做。我做了一个搜索,我看到的结果一般是询问JSON,这不是这里的情况。我怎么能这样做?
感谢您的帮助!
答案 0 :(得分:3)
首先,你的字典结构并不理想。您的字典应该具有已知的带有变量值的键名,而不是将键作为房间名称和值作为标识符。密钥不应该是"数据"在字典中。
所以,而不是
["room1":1]
如果它是
会更好["roomName":"room1", "roomID":1]
使用您当前的结构,假设每个字典只有一个密钥而且是房间名称,您可以使用以下命令获取名称:
if let rooms = myUser.rooms as? [[String : AnyObject]] {
roomNames = rooms.map({ $0.keys.first!})
}
如果您使用我建议的更好的结构,那么它将是
if let rooms = myUser.rooms as? [[String : AnyObject]] {
roomNames = rooms.map({ $0["roomName"] as? String ?? ""})
}
答案 1 :(得分:1)
我不清楚您的数据结构。如果你有一个字典数组,并且你想要所有的键,你可以使用这样的代码:
let array = [
["key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4"],
["key5": "value5",
"key6": "value6",
"key7": "value7",
"key8": "value8"],
["key9": "value9",
"key10": "value10",
"key11": "value11",
"key12": "value12"]
]
let keys = array
.map{$0.keys}
.reduce([], +)
print(keys)
这将为您提供所有词典中所有键的数组。然而,由于字典是无序的,因此每个字典中的键将是混乱的顺序。你将以混乱的顺序从每个内部字典中获取密钥,然后是数组中下一个字典中的密钥等。
示例输出:
["key2", "key3", "key4", "key1", "key7", "key8", "key5", "key6", "key9", "key10", "key12", "key11"]
如果要对键进行排序,可以这样做:
let keys = array
.map{$0.keys}
.reduce([], +)
.sorted{$0.compare($1, options: .numeric) == .orderedAscending}
(在上面的代码中,我使用String
类的compare(_:options:)
函数,其选项值为.numeric
,以便“key11”在“key10”之后排序,而不是{{1你从标准的字符串排序得到的。)
排序版本(带["key1", "key11", "key12", "key2"]
选项)的输出为:
.numeric
如果没有["key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9", "key10", "key11", "key12"]
选项,输出将为:
.numeric
如果您的密钥包含混合大写/小写但您想忽略它,则使用["key1", "key10", "key11", "key12", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9"]
选项(不区分大小写的排序,其中字符串中的数字使用数值进行比较。)