字典不允许我在其值中附加字符串

时间:2015-01-22 20:49:25

标签: ios arrays function swift dictionary

我试图创建一个带有一个名字数组的函数,然后在字典中用字母和名称作为键和值对它进行排序。但现在字典不会让我将字符串附加到值。我的代码如下所示:

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
}

错误出现在我试图将新字符串添加到字典中的行中,它说:&#34;无法调用&#39; + =&#39;使用类型&#39; $ T4,$ T6&#39;&#34;的参数列表这告诉我这些类型有问题,但我不知道如何解决它。

任何有关如何解决此问题的建议都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

这是因为字典查找总是返回一个可选项 - 因为前面的if应该确保元素存在,所以你可以安全地应用强制解包运算符:

dict[index]! += [user]

然而,在操场上运行测试会导致运行时异常 - 我认为这是条件:

if find(letterList, index) != 0 {

不可靠。

我替换为关键存在的显式检查,并且它起作用了:

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

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

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

因为数组是按值复制的值类型。将数组分配给变量实际上会创建它的副本,因此在副本上完成添加,保持原始数组不变。

答案 1 :(得分:1)

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)

不执行任何操作并返回nil,以便执行if-block。 否则

dict[index]?.append(user)

将用户附加到dict[index]和if-block中的数组 没有执行。

您也可以使用&#34; nil-coalescing运算符&#34;将其写为单行代码。 ??

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)