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

Posted

技术标签:

【中文标题】附加到 [character: [object]] 的字典返回 0 键/值对【英文标题】:Appending to dictionary of [character: [object]] returns 0 key/value pair 【发布时间】:2017-02-16 14:32:57 【问题描述】:

我正在尝试在我的用户列表中显示类似于联系人的表格视图。

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

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

在我的 fetch 方法中,我这样做了

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

在此之后,我应该让我的朋友数组包含名称的第一个字母和属于其中的用户;但是,我的朋友字典是空的。

我该如何解决这个问题?

编辑:我正在关注本教程,但他并不完全相同.. Swift: How to make alphabetically section headers in table view with a mutable data source

【问题讨论】:

您的User 类是如何定义的? firstName 是可选字符串吗? @CraigGrummitt 是的,可选字符串!谢谢 【参考方案1】:

不要使用Character 作为密钥,而是使用String。您需要确保为插入groupedNames 的每个新的First Initial 键初始化[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)
        

    

【讨论】:

像魅力一样工作。不敢相信我错过了,哈哈!欣赏它【参考方案2】:

创建一个Dictionary 结构,将Characters 作为keys 并将值作为ArrayUser 将更加简洁。

【讨论】:

这不正是我正在做的吗?我可能误解了你的说法。 @ystack【参考方案3】:

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

还要考虑合并问号/感叹号

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)

【讨论】:

以上是关于附加到 [character: [object]] 的字典返回 0 键/值对的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 将图像缩略图附加到视图的末尾

如何在 Objective-C 中将值附加到数组

循环遍历数组并附加到objective-C中的字符串

Django Channel web sockets - 将消息附加到 Model.objects

仅当行不存在时才附加到 csv

用循环附加到字典