我试图创建一个带有一个名字数组的函数,然后在字典中用字母和名称作为键和值对它进行排序。但现在字典不会让我将字符串附加到值。我的代码如下所示:
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;的参数列表这告诉我这些类型有问题,但我不知道如何解决它。
任何有关如何解决此问题的建议都将受到赞赏。
答案 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)