NSMutableDictionary对象用set方法初始化的键值真的不可修改吗

来源:互联网 发布:软件实施顾问岗位职责 编辑:程序博客网 时间:2024/06/05 02:51

有些道理听来让人恍然大悟、茅塞顿开。可再细细探索,却又不像你理解那样。最终有点啼笑皆非的感觉。

苹果推swift,很有意思的语言,学了点皮毛。出现下面这样问题。

使用NSUserDefaults.standardUserDefaults本地保存一个NSMutableDictionary对象,再用以下方法取出来后修改值,结果修改失败:

let d = NSUserDefaults.standardUserDefaults().objectForKey("d1")  as! NSMutableDictionary


网上查询有朋友如下说:

 NSMutableDictionary 对象 用set方法初始化的键值不可修改,因为NSMutableDictionary的set方法只是继承了NSDictionary的set方法,并没有重写该方法。想要修改字典内容必须用NSMutableDictionary的alloc方法初始化。


恍然大悟后改用

let d = NSMutableDictionary(dictionary:NSUserDefaults.standardUserDefaults().objectForKey("d1")  as! NSDictionary)

不错,这回能用set修改值后再转换回NSDictionary保存了。


有时间后回味起来还是有点怪怪的,用set初始化的值也是值,为什么不能改呢?如果不能改,我set改过后再set岂不又不能改,没这个道理啊。

用swift的playground看看,发现

let d = NSUserDefaults.standardUserDefaults().objectForKey("d1")  as! NSMutableDictionary

能取出值,可不能设置值。

原来是转换机制出了问题!再细查NSMutableDictionary是继承了父类NSDictionary,所以这个as转换是把父类换成子类,父类已经生效的方法未被子类方法覆盖。而NSDictionary的set方法不能做修改值用。


所以,最终的结论是:

不能强制转换NSDictionary为NSMutableDictionary,而应该使用NSMutableDictionary(dictionary:NSDictionary) 初始化方法,否则你用不了子类里覆盖父类的set方法。

那么,oc中其它子类继承后是否也有这个问题呢?姑且尽量小心点儿使用初始化方法吧,有时间再做探求。

0 0