【问题标题】:How to store boolean and nil values in a NSDictionary?如何在 NSDictionary 中存储布尔值和零值?
【发布时间】:2012-10-15 20:39:47
【问题描述】:

类似于 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)
};

布尔值
一种解决方案可能是,我这样做:

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

但如果 boo 为真,结果将完全一样

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

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

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

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

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

    【讨论】:

    • 正如我在问题一开始写的那样,当我尝试编写通用 JSON 解析器时出现了这个问题。我毫不怀疑这个参数可能会做什么。解析器只需要正确处理它们。
    【解决方案2】:

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

    【讨论】:

    • 请注意,您现在可以使用@YES 作为[NSNumber numberWithBool:] 的快捷方式。
    • 您阅读我的完整问题了吗?在那里我确实写了为什么这不是一个选项。
    • @RobNapier:请阅读我的完整问题。然后你就会明白,你的建议不是一种选择。
    【解决方案3】:

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

    @interface MyBoolean : NSObject
    @property (nonatomic, assign) BOOL boolVal;
    @end
    

    【讨论】:

    • 太棒了!而已!谢谢!
    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2012-03-10
    • 1970-01-01
    • 2021-01-04
    • 2013-04-25
    • 2012-01-06
    相关资源
    最近更新 更多