Не удалось преобразовать значение типа `[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)
}