0

Iは、(既にソートされている)構造の次のタイプの辞書の配列を有する:辞書からセクションヘッダーを生成[スイフト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]] 
} 
[..] 

私の目標ですセクションヘッダーを使ってそれらのアイテムをセクションに表示するが、それを理解して答えを探してみると、私は移動することができない。私はこのような結果を得るために文字で辞書をGROUPEしようとしました :私の配列は「Optionals」が含まれているため

[ 
    "A":{[foo1],[foo2]}, 
    "D":{[foo3],[foo5]}, 
    "F":{[foo4],[foo6]} 
    ... 
] 

しかし、運が、私はいつもエラーになってしまってきました。要約する

がどのようにスイフト3において上で与えられたもののようグループ化されていない辞書の配列を使用してテーブルビュー内の名前に基づいてアルファベット順セクションヘッダを生成することができますか?

ありがとうございます!

+0

アルファベット順に並べ替えるべきキーのキーは? – shallowThought

+0

こんにちは、それは名前のキーです、私はセクションヘッダーとしてアルファベットの文字を持っているようにしています – blackjak231

+0

"名前"キーは文字列を保持していません。または、「ItemA」が「SomeString」であると想定されていますか? – shallowThought

答えて

1

配列の.sorted(by:)メソッドを使用して、配列の要素を互いに比較することができます。

これはsortedArrayが得られます。itemNameに文字列ではありませんが、私はすべてのエラーを処理するためにあなたにそれを放置しておく

let sortedArray = arrayOfApps.sorted(by: {($0["name"] as! String) <= ($1["name"] as! String)}) 

は、これがクラッシュします。 EDIT

$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("") 
}) 
+0

あなたの答えをありがとうが、この部分は既にカバーされています:)データを返すAPIはすでにそれをソートし、私はアプリ側でソートすることができました。私の問題は、セクションヘッダーを追加するために、 "名前"の最初の文字でそれらをグループ化する方法です。とにかくあなたの答えをお寄せいただきありがとうございます:) – blackjak231

+0

あなたの質問と思われるものを反映するように私の答えを変更しました。もし100%確実にアルファベットが名前の値にアルファベット順にソートされていれば、さらに最適化されますが、正常なケースの%:-) – Emptyless

+0

@ blackjak231それはあなたのために働くのですか? – Emptyless

関連する問題