Swift 追加到[character:[object]]的字典返回0个键/值对

Swift 追加到[character:[object]]的字典返回0个键/值对,swift,dictionary,Swift,Dictionary,我正在尝试用我的用户列表显示类似于联系人的tableview 我声明了一个全局变量friends,它将存储名字的第一个字符以及名字以该字符开头的用户列表 var friends = [Character: [User]]() 在我的fetch方法中,我这样做 for friend in newFriends { let letter = friend.firstName?[(friend.firstName?.startIndex)!]

我正在尝试用我的用户列表显示类似于联系人的tableview

我声明了一个全局变量friends,它将存储名字的第一个字符以及名字以该字符开头的用户列表

var friends = [Character: [User]]()
在我的fetch方法中,我这样做

for friend in newFriends {                      
    let letter = friend.firstName?[(friend.firstName?.startIndex)!]
    print(letter)                    
    self.friends[letter!]?.append(friend)
}
在这之后,我应该让我的朋友数组包含名字的第一个字母和其中的用户;然而,我的朋友字典是空的

我该如何解决这个问题


编辑:我正在学习这篇教程,但他并不完全一样

创建一个
字典
结构,将
字符
作为
&值作为
用户
数组
,将更加简洁。

与其使用
字符
作为键,不如使用
字符串
。您需要确保为插入到
groupedNames
中的每个新初始密钥初始化
[User]
数组。我保留了一个
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)
        }

    }
}
var groupedNames=[String:[User]]()
var groupedLetters=Array()
func过滤器名称(){
groupedNames.removeAll()
groupedLetters.removeAll()
为了新朋友中的朋友{
让index=friend.firstName.index(friend.firstName.startIndex,偏移量:0)
让firstLetter=String(friend.firstName[index])。大写()
如果groupedNames[第一个字母]!=nil{
//数组已存在,只需追加
GroupedName[第一个字母]?.append(朋友)
}否则{
//没有该字母键的数组-init数组并将该字母存储在groupedLetters数组中
GroupedName[第一个字母]=[朋友]
groupedLetters.append(第一个字母)
}
}
}

发生错误的原因是您正在声明一个空的字典,这意味着您必须添加一个键/空数组对,如果该字符没有条目

同时考虑合并问号/感叹号

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)
}

这不正是我在做的吗?我可能误解了你的说法@ystack您的
用户
类是如何定义的?
firstName
是可选字符串吗?@CraigGrummitt是可选字符串!谢谢你,这工作很有魅力。真不敢相信我错过了那个lol!感激