我有一个字典数组,具有以下类型的结构(已经排序):
[
[
"id": 1,
"name": "ItemA",
"url": "http://url.com"
],
[
"id": 32,
"name": "ItemB",
"url": "http://url.com"
],
...
]
声明为 AnyObject 的字典数组:
var arrayApps = [[String:AnyObject]]()
这个字典数组是使用 SwiftyJson 生成的:
[..]
if let resData = swiftyJsonVar["data"].arrayObject {
self.arrayItems = resData as! [[String:AnyObject]]
}
[..]
我的目标是通过使用部分标题在部分中显示这些项目,但在尝试弄清楚并寻找答案后,我无法继续前进。我试图按字母对词典进行分组,得到这样的结果:
[
"A":{[foo1],[foo2]},
"D":{[foo3],[foo5]},
"F":{[foo4],[foo6]}
...
]
但是没有运气,我总是以错误告终,因为我的数组包含"可选"。
总结:如何使用不像上面在 Swift 3 中给出的字典那样分组的字典数组,根据 TableView 中的名称生成按字母顺序排列的部分标题?
提前谢谢你!!
您可以使用 Array 的 .sorted(by: )
方法与数组的元素进行比较。
这将产生一个排序数组:
let sortedArray = arrayOfApps.sorted(by: {($0["name"] as! String) <= ($1["name"] as! String)})
如果 itemName 不是字符串,这将崩溃,但我把它留给你来处理任何错误。例如,将其更改为:
$0["name"] as? String ?? ""
编辑:删除了示例并添加了扩展以创建所需的结果
我找到了我的一个旧项目,在那里我写了这样的扩展。稍微更改了一下以满足您的需求,告诉我它是否还需要一些更改:
extension Array {
func sectionTitlesForArray(withName name: (Element) -> String) -> Array<(title: String, elements: NSMutableArray)> {
var sectionTitles = Array<(title: String, elements: NSMutableArray)>()
self.forEach({ element in
var appended = false
sectionTitles.forEach({ title, elements in
if title == name(element) {
elements.add(element)
appended = true
}
})
if appended == false {
sectionTitles.append((title: name(element), elements: [element]))
}
})
return sectionTitles
}
}
// Usage single letter as Section title:
let sectionTitles = arrayOfApps.sectionTitlesForArray(withName: {
let name = $0["name"] as! String
return String(name[name.startIndex])
})
// Quick dirty pretty-print:
sectionTitles.forEach({ sectionTitle in
print("Section title: (sectionTitle.title) n")
sectionTitle.elements.forEach({ object in
let element = object as! Dictionary<String,Any>
print("Element name: (element["name"]!)")
})
print("")
})