0

У меня есть массив словарей со следующим типом структуры (который уже отсортированный):Генерировать заголовки разделов из словаря [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]] 
} 
[..] 

Моя цель состоит в чтобы отображать эти элементы в разделах, используя заголовки разделов, но, пытаясь понять это и найти ответ, я не могу двигаться дальше. Я пытался Groupe словарей по буквам, чтобы получить результат, как это:

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

Но не повезло, я не всегда в конечном итоге с ошибками, потому что мой массив содержит «ОПЦИИ».

Резюмируя: Как я могу генерировать алфавитных заголовки разделов на основе имени внутри TableView, используя массив словарей не сгруппированные как приведенные выше в Swift 3?

Благодарим вас заранее!

+0

Какой ключ словаря следует учитывать при заказе в алфавитном порядке? – shallowThought

+0

Привет, это ключ имени, и я пытаюсь получить буквы алфавита в виде заголовков разделов. – blackjak231

+0

Ключ «имя» не содержит строки. Или 'ItemA' должен быть« SomeString »? – shallowThought

ответ

1

Вы можете использовать метод Array для сравнения с элементами вашего массива друг с другом.

Это дает sortedArray:

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

Это сбою, если ITEMNAME не является строкой, но я оставил его вам обрабатывать любые ошибки. Например изменить его на:

$0["name"] as? String ?? "" 

EDIT: // Удалены примеры и добавил расширение для создания желаемого результата

Я нашел один из моих старых проектов, в которых я написал такое расширение. Измените его немного в соответствии с вашими потребностями, скажите мне, нужно ли еще какое-то изменение:

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, который возвращает данные, уже сортирует его, и я смог сортировать на стороне приложения. Моя проблема заключается в том, как сгруппировать их по первой букве «name», чтобы добавить заголовки разделов. Спасибо в любом случае за ваш ответ :) – blackjak231

+0

Я изменил свой ответ, чтобы отразить то, что, на мой взгляд, было вашим вопросом. Если вы на 100% уверены, что массив отсортирован в алфавитном порядке по значению имени, чем он может быть оптимизирован, но это будет сделано для 99 % обычных случаев :-) – Emptyless

+0

@ blackjak231 Dit это работает для вас? – Emptyless

Смежные вопросы