2017-02-16 5 views
0

Я пытаюсь показать табличное представление, подобное контактам с моим списком пользователей.Добавление в словарь слова [character: [object]] возвращает 0 key/value pair

я объявить глобальную переменные друг, который будет хранить первый символ имени и список пользователей, чье имя начинается с этой

var friends = [Character: [User]]() 

В моих выборках методы, я делаю это

for friend in newFriends {      
    let letter = friend.firstName?[(friend.firstName?.startIndex)!] 
    print(letter)      
    self.friends[letter!]?.append(friend) 
} 

После этого у меня должен быть массив моих друзей с первой буквой имени и пользователями, которые попадают в нее; однако мой словарь друзей пуст.

Как исправить это?

Edit: Я следую за этот урок, и он оленья кожа точно такой же .. Swift: How to make alphabetically section headers in table view with a mutable data source

+0

Как определяется ваш класс 'User'? Является ли 'firstName' дополнительной строкой? –

+0

@CraigGrummitt да дополнительная строка! Спасибо – Walker

ответ

0

Вместо того, чтобы использовать Character в качестве ключа, используйте String. Вы должны быть уверены, чтобы инициализировать массив [User] для каждого нового первого начального ключа, который вы вставляете в groupedNames. Я держу массив groupedLetters, чтобы сделать его легче посчитать раздел

var groupedNames = [String: [User]]() 
var groupedLetters = Array<String>() 

func filterNames() { 
    groupedNames.removeAll() 
    groupedLetters.removeAll() 

    for friend in newFriends { 
     let index = friend.firstName.index(friend.firstName.startIndex, offsetBy: 0) 
     let firstLetter = String(friend.firstName[index]).uppercased() 
     if groupedNames[firstLetter] != nil { 
      //array already exists, just append 
      groupedNames[firstLetter]?.append(friend) 
     } else { 
      //no array for that letter key - init array and store the letter in the groupedLetters array 
      groupedNames[firstLetter] = [friend] 
      groupedLetters.append(firstLetter) 
     } 

    } 
} 
+0

Работает как шарм. Не могу поверить, что я пропустил этот LOL! ценить это – Walker

0

Создание Dictionary структуры с Characters как keys & значений как Array из User будет более емким.

+0

Разве это не совсем то, что я делаю? Возможно, я неправильно понял ваше заявление. @ystack – Walker

0

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

Рассмотрим также закрепить вопрос/восклицательные знаки

class User { 
    let firstName : String 

    init(firstName : String) { 
     self.firstName = firstName 
    } 
} 


var friends = [Character: [User]]() 

let newFriends = [User(firstName:"foo"), User(firstName:"bar"), User(firstName:"baz")] 

for friend in newFriends { 
    let letter = friend.firstName[friend.firstName.startIndex] 
    if friends[letter] == nil { 
     friends[letter] = [User]() 
    } 
    friends[letter]!.append(friend) 
} 

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

  • Нет связанных вопросов^_^