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