0

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

[
 [
  "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]}
  ...
]

但运气不好,我总是以错误告终,因为我的数组包含“Optionals”。

总而言之: 如何根据 TableView 中的名称生成按字母顺序排列的部分标题,使用的字典数组没有像上面在 Swift 3 中给出的那样分组?

先感谢您 !!

4

1 回答 1

2

您可以使用 Array 的.sorted(by: )方法将数组中的元素相互比较。

这产生一个 sortedArray:

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("")
})
于 2017-01-07T20:35:08.747 回答