2016-07-26 54 views
0

我要检查是否有NSUserDefaults的与dic密钥的值,然后加载的数据,并保存到loadedDic如果存在数据,或者设置的loadedDic值如果不是,则保存到NSUserDefaultsNSUserDefaults.standardUserDefaults()。dictionaryForKey()返回编译错误

error!注释语句返回一条错误消息:

不能分配[String : AnyObject]?类型的值[String : [String]]

我想因为该方法dictionaryForKey的返回类型说AnyObject它会好起来的。还是不完全了解这种AnyObject类型:(

任何人都可以向我解释什么使得错误,我应该怎么照顾这个问题致谢?提前。

下面的代码块是viewDidLoad()方法。在UIViewController

var loadedDic = [String : [String]]() 

let defaults = NSUserDefaults.standardUserDefaults() 

if defaults.dictionaryForKey("dic") != nil { 
    print("there's the value i want") 
    loadedDic = defaults.dictionaryForKey("dic")//error! 
}else { 
    //some codes to set values of 'loadedDic'. this part works properly 

    defaults.setObject(loadedDic, forKey: "dic") 
    if defaults.synchronize(){ 
    print("saved") 
    } 
} 
+0

时不要使用'.synchronize()',这是过时的。只要你执行'.setObject',默认就已经被保存了。 – Moritz

+0

只要调用'.setObject',就不会保存默认值。请参阅文档在这里:https://developer.apple.com/reference/foundation/userdefaults/1414005-synchronize – yuji

回答

1

NSUserDefaults收到字典的检查型,预计类型:

if defaults.dictionaryForKey("dic") != nil { 
    print("there's the value i want") 
    if let dic = defaults.dictionaryForKey("dic") as? [String : [String]]{ 
     loadedDic = dic 
    } 
} 
+0

你甚至不需要第一个'如果'这里 – sage444

0

尝试

 var loadedDic = [String : AnyObject]() 

,而不是

var loadedDic = [String : [String]]() 
+0

这一个不工作。错误信息与问题中的信息非常相似; “不能将[String:AnyObject]类型的值赋给[String:[AnyObject]]”。请注意,该值是一个String数组。 –

+0

检查更新的答案!如果它的工作! – Lion

-1

你必须做这样的方式。现在

var loadedDic = Dictionary<String, AnyObject>() 

,在获取字典从NSUserDefault

let defaults = NSUserDefaults.standardUserDefaults() 

if let dic : Dictionary<String, AnyObject> = defaults.dictionaryForKey("dic") as! Dictionary<String, AnyObject> 
{ 
    loadedDic = defaults.dictionaryForKey("dic") 
} 
else 
{ 
    //some codes to set values of 'loadedDic'. this part works properly 
    // Make sure you store it in Dictionary<String, AnyObject>() manner 

    defaults.setObject(loadedDic, forKey: "dic") 
    if defaults.synchronize(){ 
     print("saved") 
    } 
}