Нет точных совпадений при вызове индекса [Swift]

#swift #dictionary #for-loop #input

#swift #словарь #for-цикл #ввод

Вопрос:

Под этим вы можете увидеть мой код. Я прокомментировал строку, которая вызывает ошибку. Сообщение об ошибке: «Нет точных совпадений при вызове нижнего индекса». Вы знаете, как я могу избежать этой ошибки? Спасибо за вашу помощь!

         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
        }
 

Ответ №1:

На самом деле вы должны получить сообщение об ошибке

Невозможно указать значение типа ‘[String: Int]’ с аргументом типа ‘String.Элемент’ (он же ‘Символ’)

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)
}
 

Ответ №2:

Как говорит @vadian, похоже str , что это an Optional<String> . Перебор строки дает вам Character s, но ваши ключи словаря String равны s . Вам нужно преобразовать каждый символ в a 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")
    }
}