iphone - 在 plist 中处理持久 boolean 值的最佳方法?

标签 iphone objective-c boolean nsmutabledictionary nsnumber

处理源自 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/

相关文章:

JavaScript boolean 比较总是失败

python - 为 Python 中的任何表达式创建真值表

iphone - 我应该担心 NSUserDefaults 中的冲突吗?

iphone - AUMixer之后的RemoteIO回调

ios - 如何为 iOS 构建杂志应用程序

objective-c - 如何使用 Kiwi 异步测试委托(delegate)

ios - Xcode - UTF-8 字符串编码

python - var == False 或如果不是 var

iphone - 导航栏中间的按钮

ios - NSInvalidArgumentException - 无法识别的选择器发送到实例