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

しかし、うまくいきません。配列に「オプション」が含まれているため、常にエラーが発生しました。

要約 すると、Swift 3 で上記のようにグループ化されていない辞書の配列を使用して、TableView 内の名前に基づいてアルファベット順のセクション ヘッダーを生成するにはどうすればよいですか?

前もって感謝します !!

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 ?? ""

編集: // 例を削除し、目的の結果を作成するための拡張機能を追加しました

そのような拡張機能を書いた古いプロジェクトの 1 つを見つけました。あなたのニーズに合わせて少し変更しました。まだ変更が必要かどうか教えてください:

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 に答える