Не удалось преобразовать значение типа `[String: String?]` В ожидаемый тип аргумента `[String: String!]`

Привет, я получаю ошибку при добавлении значения в dictornary. я использую Xcode 7 а также Swift 2,Сообщение об ошибке: не удается преобразовать значение типа [String: String?] к ожидаемому типу аргумента [String: String!]

Декларация:

var arrVoiceLanguages: [Dictionary<String, String!>] = []

Следующее моя функция

  for voice in AVSpeechSynthesisVoice.speechVoices() {
        let voiceLanguageCode = (voice as AVSpeechSynthesisVoice).language

        let languageName = NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: voiceLanguageCode)

        let dictionary = ["languageName": languageName, "languageCode": voiceLanguageCode]

        arrVoiceLanguages.append(dictionary)
    }

Любая помощь приветствуется.

Я не знаю, почему люди голосуют по этому вопросу.

2 ответа

Возможно, ваша переменная arrVoiceLanguages ​​объявила тип [String:String!] И NSLocale.currentLocale(). Тип возвращаемого значения функции displayNameForKey() - String?.

Таким образом, вы можете попробовать это (я добавил! В конце, чтобы развернуть значение).

let languageName = NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: voiceLanguageCode)!

Ваш arrVoiceLanguages тип массива должен быть:

var arrVoiceLanguages = [[String: String?]]()

Или вам нужно развернуть languageName сюда:

guard let languageName = NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: voiceLanguageCode) else {return}

Так как NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: voiceLanguageCode) вернуть необязательную строку.

Распаковывая languageName вам не нужно менять тип вашего arrVoiceLanguages массив. И ваш код будет:

var arrVoiceLanguages: [Dictionary<String, String!>] = []

    for voice in AVSpeechSynthesisVoice.speechVoices() {
        let voiceLanguageCode = (voice as AVSpeechSynthesisVoice).language

        guard let languageName = NSLocale.currentLocale().displayNameForKey(NSLocaleIdentifier, value: voiceLanguageCode) else {return}

        let dictionary = ["languageName": languageName, "languageCode": voiceLanguageCode]

        arrVoiceLanguages.append(dictionary)
    }
Другие вопросы по тегам