字典不允许我将字符串附加到它的值

Dictionary won't let me append a string to its values

我正在尝试创建一个函数,它接受一个名称数组,并在字典中以字母和名称作为键和值对它进行排序。但是现在字典不允许我将字符串附加到值。我的代码如下所示:

func listCounter(usernames: [String])->Dictionary <String,[String]> {
    var dict=Dictionary<String,[String]>()
    var letterList = [String]()

    for user in usernames{

        var index = user.substringToIndex(advance(user.startIndex,1))
        index = index.lowercaseString as String

        if find(letterList, index) != 0{
        dict[index] += [user]

        }else{
        dict[index] = [user]

            letterList += [index]
        }
    }
    return dict
}

错误出现在我试图将新字符串添加到字典的那一行,它说:"Cannot invoke '+=' with an argument list of type '$T4,$T6'" 这告诉我类型有问题,但我不知道如何解决。

任何有关如何解决此问题的建议都将不胜感激。

发生这种情况是因为字典查找总是 returns 一个可选的 - 因为前面的 if 应该确保该元素存在,您可以安全地对其应用强制展开运算符:

dict[index]! += [user]

但是 运行 在 playground 上的测试导致运行时异常 - 我认为这种情况:

if find(letterList, index) != 0 {

不可靠。

我替换为对密钥是否存在的显式检查,它起作用了:

if dict[index] != nil {
    dict[index]! += [user]

注意:我没有像这样使用可选绑定:

if var element = dict[index] {
    element += [user]

因为数组是值类型,按值复制。将数组赋值给一个变量实际上创建了它的一个副本,所以加法是在副本上完成的,原始数组保持不变。

if find(letterList, index) != 0 { ... }

其实应该是

if find(letterList, index) != nil { ... }

或者只是

if contains(letterList, index) { ... }

不过@Antonio已经解释了错误信息并给出了解决方案。作为替代方案,您还可以利用 可选链接:

for user in usernames {

    var index = user.substringToIndex(advance(user.startIndex,1))
    index = index.lowercaseString as String

    if (dict[index]?.append(user)) == nil {
        dict[index] = [user]
        letterList.append(index)
    }
}

它是如何工作的?如果 dict[index]nil,那么

dict[index]?.append(user)

什么都不做,returns nil,因此执行 if 块。 否则

dict[index]?.append(user)

将用户附加到 dict[index] 和 if 块中的数组 未执行。

你也可以把它写成一行,使用 "nil-coalescing operator" ??:

for user in usernames {

    var index = user.substringToIndex(advance(user.startIndex,1))
    index = index.lowercaseString as String

    dict[index] = (dict[index] ?? []) + [user]
}

此处,dict[index] ?? [] 求值为字典值,如果 已经存在,否则为空数组。和阵列 所有索引的也可以在循环之后计算

letterList = Array(dict.keys)