2015-05-05 99 views
3

我创建了一个二维的字典是这样,它精细编译:斯威夫特二维字典错误

var locale : [String : [String : String]] = 
    ["en" : ["create" : "Create", "cancel" : "Cancel"], 
    "fr" : ["create" : "Creer", "cancel" : "Annuler"]] 

但使用时:

var lang = NSUserDefaults.standardUserDefaults().objectForKey("MyLanguage") as! String 
let createButton = UIBarButtonItem(title: locale[lang]["create"], 
      style: UIBarButtonItemStyle.Plain, target: self, action: "createAction:") 
self.navigationItem.rightBarButtonItem = createButton 

我得到以下编译错误:

Cannot subscript a value of type '[String : String]?' with an index of type 'String' 

我现在将使用一种替代解决方案,但我不明白错误,并且没有找到二维dic的运气举例。什么是2d字典的正确方法?

回答

3

仰望在字典中的值返回一个可选的这epression(因为该键不存在。):

locale[lang]["create"] 

应该

locale[lang]!["create"] 

相反。

请注意,如果字典中没有当前语言的条目,则代码将会崩溃。这将是更安全的使用可选的结合:

if let createButtonTitle = locale[lang]?["create"] 
{ 
    let createButton = UIBarButtonItem(
    title: createButtonTitle, 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action: "createAction:") 
    self.navigationItem.rightBarButtonItem = createButton 
} 
+0

是,它的工作!但为什么我们不需要第二个维度呢? like locale [lang]![“create”]!因为它是另一个可能缺少密钥的字典。 – user2985898

+0

我的答案中有一个错字。它应该是'如果让createButtonTitle = locale [lang]?[“create”]'。它的工作原理(我认为)是因为如果进程中的任何步骤导致nil,处理将停止,{}中的代码不会执行。 –

0

当你调用locale[lang]它返回一个可选的,因此应改为locale[lang]?["create"]locale[lang]!["create"]