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中其它子类继承后是否也有这个问题呢?姑且尽量小心点儿使用初始化方法吧,有时间再做探求。
- NSMutableDictionary对象用set方法初始化的键值真的不可修改吗
- NSMutableDictionary 用set方法初始化的字典 里边的键值不可修改
- 【OC易错】误以为NSMutableDictionary对象添加键值对的方法为addObject:forKeys
- c++中const变量真的不可以修改吗?
- c++中const变量真的不可以修改吗?
- c++中const变量真的不可以修改吗?
- c++中const变量真的不可以修改吗?
- 20. 不可修改的对象
- objective-c的NSMutableDictionary对象数据修改测试
- NSMutableDictionary的遍历方法
- 对象的初始化方法
- 大学真的非谈恋爱不可吗
- 地震真的不可预测吗?
- String类真的不可变吗?
- python的list,tuple,dist,set和不可变对象
- stl对象的初始化方法
- oc对象的初始化方法
- NSDictionary与NSMutableDictionary的常用方法
- STL中list实现降序排列
- ViewStub惰性装载控件
- 恩,今天是被cin.get()戏弄。
- listview当选中某一个item时设置背景色其他的不变
- VC常用小知识
- NSMutableDictionary对象用set方法初始化的键值真的不可修改吗
- android-设计模式的应用
- sql server行版本控制的隔离级别
- Unity3D中Layers和LayerMask解析
- componentsJoinedByString 和 componentsSeparatedByString 的方法的区别
- flex实现图片根据鼠标的滚动放大或缩小(以鼠标的的位置 为中心放大缩小)
- Java程序编译和运行的过程
- ORA-12504:TNS:监听程序在CONNECT_DATA中未获得SERVICE_NAME 2012-12-17 11:27:36 分类: Linux 客户端配置好服务名后,用PL/SQL De
- curl_multi