在调用下标[Swift]时没有精确匹配



下面可以看到我的代码。我注释了导致错误的行。错误消息:调用下标"时没有精确匹配。你知道我怎样才能避免这个错误吗?谢谢你的帮助!

let dic = ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9, "j": 10, "k": 11, "l": 12, "m": 13, "n": 14, "o": 15, "p": 16, "q": 17, "r": 18, "s": 19, "t": 20, "u": 21, "v": 22, "w": 23, "x": 24, "y": 25, "z": 26]
var newwrd = ""
for var i in str ?? "" {
let ci = dic[i]   // This line causes the error
}

实际上你应该得到错误

不能将参数类型为'String '的值下标为'[String: Int]'。元素'(又名'字符')

str显然是String?,枚举字符串时元素类型是Character,但订阅类型必须是String

let dic = ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9, "j": 10, "k": 11, "l": 12, "m": 13, "n": 14, "o": 15, "p": 16, "q": 17, "r": 18, "s": 19, "t": 20, "u": 21, "v": 22, "w": 23, "x": 24, "y": 25, "z": 26]
for i in str ?? "" { // no need for var i
let ci = dic[String(i)] ?? 0
print(ci)
}

如果字符串包含字典中没有的字符,则结果为0。


有一个不需要辅助字典的更短的方法

for i in str ?? "" where ("a"..."z") ~= i {
let ci = Int(i.asciiValue!) - 96
print(ci)
}

正如@vadian所说,看起来strOptional<String>。通过字符串循环得到Characters,但字典键是Strings。您需要将每个字符转换为String,并处理可选项。试试下面的代码:

let str: String? = "abcqrml@"
let dic = ["a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9, "j": 10, "k": 11, "l": 12, "m": 13, "n": 14, "o": 15, "p": 16, "q": 17, "r": 18, "s": 19, "t": 20, "u": 21, "v": 22, "w": 23, "x": 24, "y": 25, "z": 26]
var newwrd = ""
for i in str ?? "" {
if let ci = dic[String(i)] {
print("dic[(i)] = (ci)")
}  else {
print("dic[(i)] = nil")
}
}

相关内容

最新更新