2015-08-23 2 views
0

У меня есть данные словаря в этом формате.Как сгруппировать словарные данные с Swift

var data: [[String:AnyObject]] = 

[ 
    [ 
    "id": "1", 
    "title": "A Title", 
    "Detail": "This is a String" 
    ],  
    [ 
    "id": "2", 
    "title": "A Title Again", 
    "Detail": "This is a String" 
    ], 
    [ 
    "id": "3", 
    "title": "B Title", 
    "Detail": "This is a String" 
    ], 
    [ 
    "id": "4", 
    "title": "B Title Again", 
    "Detail": "This is a String" 
    ] 
] 

Кто-нибудь есть идея, как я могу группа моего Tableview от [A-Z] как изображение прототипа ниже с Swift.

Prototype

ответ

2

Это двухступенчатая проблема (которую мы разрешим в чистом Swift). . Во-первых, мы должны определить, какие разделы есть (в этом случае, просто A и B Это довольно просто:

var letters = Set<String>() 

for element in data { 
    var title = element["title"] as? String 
    let letter = title?.substringToIndex(advance(title!.startIndex, 1)) 

    letters.insert(letter!) 
} 

Сначала мы создаем набор String объектов, так что каждая буква представлена ​​только один раз. чтобы получить первый символ (в чистом Swift), мы должны использовать substringToIndex и передавать значение String.Index с использованием advance. в качестве примечания, если вы хотите, чтобы нормализовать письма, добавлять .uppercaseString перед вставкой буквы в letters.

print(letters) затем выдает [A, B].

-

Во-вторых, нам нужно сортировать data ключом title. Swift делает сортировку очень просто:

data.sort { element1, element2 in 
    let title1 = element1["title"] as? String 
    let title2 = element2["title"] as? String 

    return title1 < title2 
} 

Вы можете организовать данные, как вам нравится, теперь зная, как и сортировать по ключу, и определить, какие буквы, чтобы показать. Надеюсь это поможет!

+0

Много спасибо mate! Это сработало для меня. У меня сейчас небольшая проблема. Как добавить буквы в (sectionIndexTitlesForTableView), чтобы они отображались справа. Когда я 'возвращаю буквы', я получаю ошибку' 'Set ' не конвертируется в '[String]' ' – youngbobby

+0

Добро пожаловать! Вы можете использовать 'let lettersArray: [String] = Array (letters)', и это должно исправить эту ошибку. Пожалуйста, подумайте о принятии ответа, если это было полезно :) –

+0

Спасибо. У меня все еще есть проблема :(Не могли бы вы посоветовать мне, как вернуть 'numberOfSectionsInTableView' и' numberOfRowsInSection', потому что по каким-то странным причинам моя таблица дважды повторяла мои словарные данные, вероятно, ошибка из 'numberOfSectionsInTableView' – youngbobby

1

Вы хотите UITableViewDataSource API.

Таблица, на которой изображено изображение, представляет собой обычный стол с заголовками и разделами.

Некоторые из методов, которые вы хотите реализовать, это numberOfSectionsInTableView и titleForHeaderInSection. Для прокручиваемого индекса рядом с таблицей вы хотите sectionIndexTitlesForTableView. Все эти методы описаны в ссылке выше.

Вы можете рассмотреть сортировку массива и разбить его буквой алфавита, но это может быть дорогостоящим, поэтому не делайте этого, пока ваш пользователь прокручивает.

+1

Спасибо @Moshe, не могли бы вы посоветовать мне, как бы я сортировал свой массив и разбивал его буквой алфавита. Я совершенно новый, быстрый. Пожалуйста, простите мой «основной» вопрос. – youngbobby

+0

Есть несколько методов для NSArray, которые вам помогут. К сожалению, я не уверен, что такое «быстрый» способ сделать это, но посмотрите классы NSArray и NSPredicate и посмотрите, помогут ли они вам. – Moshe

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