2015-10-16 59 views
-2

您好,我在將值附加到dictornary時出錯。我正在使用Xcode 7Swift 2錯誤消息:不能[String: String?]類型的值轉換爲預期的參數類型[String: String!]無法將類型`[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) 
    } 

任何幫助表示讚賞。

我不知道爲什麼人們對這個問題放棄投票。

+0

看到我編輯的問題 –

回答

1

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

也許你arrVoiceLanguages變量聲明[字符串:字符串!]類型和NSLocale.currentLocale()displayNameForKey()函數的返回類型爲String?。

所以你可以嘗試這個(我加了!在結束打開價值)。

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

是的..這對我很有用。謝謝。 –

相關問題