在对下标进行调用时未找到确切匹配 [Swift]

6

在此之下,您可以看到我的代码。我已经注释掉了导致错误的那一行。错误信息:“No exact matches in call to subscript”。您知道我如何避免这个错误吗?感谢您的帮助!

        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
        }
2个回答

2

实际上,您应该会收到以下错误:

无法使用类型为“String.Element”(即“Character”)的参数对类型为“[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)
}

1
正如@vadian所说,看起来str是一个Optional<String>。遍历字符串会给你Character,但是你的字典键是String。你需要将每个字符转换为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")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接