1

与 Javascript-Object 类似,我需要将布尔值和 nil 值存储在 Objective-C NSDictionary 中。(当我尝试编写通用 JSON 解析器时确实出现了这个问题)(是的,我知道那里有一些很好的即用型解析器,但我想尝试编写自己的。)

这是我想做的一个例子:

NSString* str = @"a string";
NSNumber* num = @123.456;
NSArray*  arr = @[@"abc",@99];
boolean   boo = true;
id        obj = nil;

NSDictionary* dict = @{
    @"key1" : str,
    @"key2" : num,
    @"key3" : arr,
    @"key4" : boo,   //will not work since boo is not an object
    @"key5" : obj    //will not work since obj is nil
};

//later in the same piece of code:

dict = @{
    @"key1" : str,
    @"key2" : num,
    @"key3" : arr,
    @"key4" : @1,  //Here we have the NSNumber 1 assigned to key4
                   //(which is not the boolean value true)
    @"key5" : @""  //an empty NSString-Object (which is not nil)
};

boolean
一个解决方案可能是,我这样做:

    ...
    @"key4" : [NSNumber numberWithBool:boo];
    ...

但如果 boo 为真,结果将与

    ...
    @"key4" : @1;
    ...

如果它是假的,那将是相同的

    ...
    @"key4" : @0;
    ...

但我需要知道原始值是布尔值还是数字。

nil vs. placeholder-object
我可以使用空字符串 (@"")、某个数字 (-1) 或其他内容之类的占位符,而不是将 nil 作为值分配给字典。但后来,我没有机会知道,我是否确实存储了占位符,因为我想存储 nil,或者我是否确实存储了一个偶然与我的占位符相同的有效值。

4

3 回答 3

5

要添加布尔值,请使用 [NSNumber numberWithBool:YES/NO],对于 nil 值,请使用 [NSNull null]。您不应该关心最初的值是什么(布尔值或数字),使用 JSON 解析器的人应该知道会发生什么。

于 2012-10-25T16:13:16.353 回答
2

如果你不能使用 NSNumber 来封装 BOOL,也不能使用 NSNull,你的下一个选择是创建你自己的包装类:

@interface MyBoolean : NSObject
@property (nonatomic, assign) BOOL boolVal;
@end
于 2012-10-25T16:24:05.383 回答
0

你的问题听起来有点混乱。这个参数,你想在哪里设置这个布尔值,代表什么?为什么你需要知道它是数字还是布尔值?

如果您有这种情况,制作自己的模型总是好的。

于 2012-10-25T16:10:45.577 回答