【问题标题】:Objective-C dictionary inserting a BOOL插入 BOOL 的 Objective-C 字典
【发布时间】:2011-01-07 15:50:22
【问题描述】:

好吧,我有点困惑。 这可能只是一件小事。

我有一个看起来像这样的函数:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails {
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setValue:news  forKey:@"getNews"];
[parameters setValue:mails forKey:@"getMails"];...}

不管我使用setValue:forKey: 还是setObject:ForKey:,我总是收到警告:

“传递 set 的参数 1... 使指针从整数而不进行强制转换”...

到底如何在字典中插入一个布尔值?

【问题讨论】:

    标签: objective-c dictionary boolean


    【解决方案1】:

    NSDictionary 中的值必须是对象。要解决此问题,请将布尔值包装在 NSNumber 对象中:

    [parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"];
    [parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"];
    

    【讨论】:

    • 别忘了使用 Clang v3.1,我们可以使用文字:NSNumber *yesNumber = @YES;相当于[NSNumber numberWithBool:YES]
    • 因此,正如@coco 所说,您可以分别使用@YES@NO 作为[NSNumber numberWithBool:YES][NSNumber numberWithBool:NO] 的替代品。正如@AlBlue 在下面指出的那样,稍后从字典中检索值的方法是使用[[myDictionary objectForKey:theKey] boolValue]
    • No No No. 你使用的是 setValue,它不是 NSMutableDictionary 方法,而是 KVO 方法。请改用 setObject。
    • 只是关于 setObject:forKey 方法的注意事项 - Objective C 实际上会让你调用 setObject:false。原因是false被替换为0,相当于nil。因此,通过将对象设置为 false,您将其设置为 nil,并且将字典中的对象设置为 nil 实际上会从字典中删除条目。因此,换句话说,它相当危险,并且会导致非常意外的行为。
    【解决方案2】:

    Objective-C 容器只能存储 Objective-C 对象,因此您需要将 BOOL 包装在某个对象中。您可以使用[NSNumber numberWithBool] 创建一个 NSNumber 对象并存储结果。
    稍后您可以使用 NSNumber 的 -boolValue 取回您的布尔值。

    【讨论】:

      【解决方案3】:

      现代代码供参考:

      parameters[@"getNews"] = @(news);
      

      【讨论】:

        【解决方案4】:

        BOOL 不是对象 - 它是 int 的同义词,其值为 0 或 1。因此,它不会被放入包含对象的结构中。

        您可以使用 NSNumber 为任何整数类型创建对象包装器;有一个构造函数[NSNumber numberWithBool:],您可以调用它来获取一个对象,然后使用它。同样,您可以使用它再次取回对象:[obj boolValue]

        【讨论】:

          【解决方案5】:

          您可以插入 @"YES"@"NO" 字符串对象,一旦您读回它们,Cocoa 会将其转换为 bool。

          否则我建议使用工厂方法创建字典,例如 dictionaryWithObjectsAndKeys:

          【讨论】:

          • 这听起来很危险——如果你想要字符串怎么办?
          • 我可能弄错了,但使用 boolValue 和 stringValue 会产生所需的结果。需要布尔值吗?使用布尔值。需要字符串吗?使用 stringValue。
          【解决方案6】:

          看到@Steve Harrison 的回答,我确实有一条评论。由于某种原因,这不适用于传递对象属性,例如 for

           [parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"];
          

          这会将参数NSDictionary 中的news 键设置为null(由于某种原因无法真正理解为什么)

          我唯一的解决方案是使用@Eimantas的方式如下:

          [parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"];
          

          这完美无缺。不要问我为什么直接通过BOOL 不起作用,但至少我找到了解决方案。有什么想法吗?

          【讨论】:

            猜你喜欢
            • 2010-11-16
            • 1970-01-01
            • 2020-03-13
            • 2011-10-04
            • 1970-01-01
            • 1970-01-01
            • 2013-02-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多