3

处理从 UISwitch 设置派生并存储在作为持久设置保存到用户目录的 NSMutableDictionary 中的布尔值的最佳方法是什么?具体来说,在写入文件系统和从文件系统读取的 NSMutableDictionary 中,保持布尔值与数值不同的最佳方法是什么?

========

补充说:感谢阿德里安和本。所以,结果是如果通过 [NSNumber numberWithBool:] 存储(这是我一直在做的)没有方便的方法来确定该值是否源自布尔值,对吗?

第二部分是我存储的 NSMutableDictionary 最初是通过具有布尔值的 plist 创建它来创建的。这些值在第一次读入时具有 NSCFBoolean 类。现在我的策略是将我在字典中使用的值与 plist 中的相应条目进行比较。

这很重要的原因是我正在动态生成界面元素以允许用户操作这些值,并且我正在将布尔值与 UISwitch 相关联。如果我通过转换为数字而丢失了原始类,我会得到一个不合适的用户界面元素。

我正在考虑将数组替换为存储值,其中第一个值是存储值,其余条目是选择:如果存在两个选择,则将其视为布尔值...在其他情况下,它们用作选择器价值观。但这似乎很麻烦,如果可靠的话。

欢迎任何想法...

4

3 回答 3

11

BOOL 值被序列化为 NSNumber 实例,通过 NSNumber 的 numberWithBool: 静态方法创建:

BOOL ok = YES;
NSNumber *value = [NSNumber numberWithBool:ok];

// ...later...

BOOL answer = [value boolValue];

没有其他方法可以序列化 BOOL 值。在生成的 plist 中,如果保存为 XML,则 BOOL 值显示为 <true/> 和 <false/> 实体。

(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 中的数据的内部类型,但这似乎可以解决问题。

于 2010-01-04T15:59:37.717 回答
3

您还可以使用常量 kCFBooleanTrue 和 kCFBooleanFalse,不过要将它们添加到 NS 中,您需要将它们转换为 ID:

[myDictionary setObject: (id) kCFBooleanTrue forKey: @"am_I_awesome"];
于 2010-01-04T16:05:32.297 回答
1

CFBolean 对象用于表示 CoreFoundation plist 和集合中的布尔值。使用 CFBoolean 可确保最大的兼容性,尤其是在与第三方软件通信时。

以下函数将 CFBoolean 对象的值作为 C 类型布尔值返回。

Boolean CFBooleanGetValue (CFBooleanRef boolean);

以下常量提供对 true 和 false 对象的访问。

const CFBooleanRef kCFBooleanTrue;
const CFBooleanRef kCFBooleanFalse;
于 2011-09-07T15:07:06.957 回答