从字典 [Swift 3] 生成节标题



我有一个字典数组,具有以下类型的结构(已经排序):

[
 [
  "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("")
})

最新更新