【问题标题】:Dictionary won't let me append a string to its values字典不允许我将字符串附加到其值
【发布时间】:2023-03-19 16:33:01
【问题描述】:

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

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
}

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

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

【问题讨论】:

    标签: ios arrays function swift dictionary


    【解决方案1】:

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

    dict[index]! += [user]
    

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

    if find(letterList, index) != 0 {
    

    不可靠。

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

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

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

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

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

    【讨论】:

    • 非常感谢,非常有帮助。不知道它返回了一个可选的。
    【解决方案2】:
    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 块 没有被执行。

    您也可以将其编写为单行,使用“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)
    

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 2018-12-27
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2020-11-18
      • 2023-02-24
      • 2016-12-30
      相关资源
      最近更新 更多