处理源自 UISwitch 设置并存储在作为持久设置保存到用户目录的 NSMutableDictionary 中的 boolean 值的最佳方法是什么?具体来说,在写入文件系统和从文件系统读取的 NSMutableDictionary 中保持 boolean 值与数值不同的最佳方法是什么?
========
添加:感谢 Adrian 和 Ben。因此,结果是,如果通过 [NSNumber numberWithBool:] 存储(这就是我一直在做的),则没有方便的方法来确定该值是否源自 boolean 值,对吗?
第二部分是我存储的 NSMutableDictionary 最初是通过具有 boolean 值的 plist 创建的。这些值在第一次读入时具有 NSCFBoolean 类。现在我的策略是将我在字典中使用的值与 plist 中的相应条目进行比较。
这很重要的原因是我正在动态生成界面元素以允许用户操纵这些值,并且我正在将 boolean 值与 UISwitch 相关联。如果我通过转换为数字丢失了原始类,我会得到一个不合适的用户界面元素。
我正在考虑将数组替换为存储值,其中第一个值是存储值,其余条目是选择:存在两个选择的地方,它被视为 boolean 值......在其他情况下,它们作为选择器值。但这似乎很麻烦,如果可靠的话。
欢迎任何想法...
最佳答案
BOOL 值被序列化为 NSNumber 实例,通过 NSNumber 的 numberWithBool: 静态方法创建:
BOOL ok = YES;
NSNumber *value = [NSNumber numberWithBool:ok];
// ...later...
BOOL answer = [value boolValue];
没有其他方法可以序列化 BOOL 值。在生成的 plist 中,如果保存为 XML,则 BOOL 值显示为
(2010 年 1 月 17 日版)
根据我上面的评论,当 NSNumber 实例加载到内存中时,这段代码可以帮助识别不同的子类型,使用“objCType”消息:
NSString *path = [[NSBundle mainBundle] pathForResource:@"untitled"
ofType:@"plist"];
NSArray *array = [NSArray arrayWithContentsOfFile:path];
for (id item in array)
{
NSLog(@"%@", [NSString stringWithCString:[item objCType]
encoding:NSUTF8StringEncoding]);
}
其中 untitled.plist 具有以下结构:
<plist version="1.0">
<array>
<integer>123</integer>
<true/>
<real>1.2</real>
</array>
</plist>
在这种情况下,上面代码的执行给出了:
2010-01-17 17:04:35.100 Untitled[62206:207] q
2010-01-17 17:04:35.101 Untitled[62206:207] c
2010-01-17 17:04:35.102 Untitled[62206:207] d
也许有不同的方法来获取存储在 NSNumber 中的数据的内部类型,但这似乎可以解决问题。
关于iphone - 在 plist 中处理持久 boolean 值的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2000335/