【问题标题】:bool for key in NSMutableArrayNSMutableArray 中键的布尔值
【发布时间】:2013-08-29 09:56:40
【问题描述】:

我有这样的代码

if ([dataArray valueForKey:@"success"]) {
    [self.feedsArray addObjectsFromArray:dataArray];
    NSLog(@"self.feedsArray: %@",self.feedsArray);
} else {
    NSLog(@"no feed found ");
}

dataArray 是一个 NSMutableArray,它最终包含一个 JSON 字典。

但我得到相同的控制台输出,无论成功与否,无论是真还是假,但我的控制台输出始终相同。我的控制台输出是:

对于 FALSE 或 NO:

self.feedsArray: (
    {
        action = register;
        message = "Invalid parameters";
        success = 0;
    }
)

对于 TRUE 或 YES:

self.feedsArray: (
    {
        action = register;
        message = "valid parameters";
        success = 1;
    }
)

在这两种情况下,如果部分被执行。

在 NSUserDefaults 中有一个方法 boolForKey,但是在 NSMutableArray 的情况下如何做到这一点。

【问题讨论】:

    标签: iphone ios objective-c ios6


    【解决方案1】:

    您需要阅读[NSArray valueForKey:] 的细则,特别是:

    返回一个包含调用 valueForKey 的结果的数组:使用 键在数组的每个对象上。

    和:

    返回的数组包含每个对象的 NSNull 元素 返回零。

    因此,如果该数组包含 3 个对象,并且它们都没有 success 键,那么您将得到一个包含 3 个 NSNull 对象的数组返回。

    因此,只要dataArray 非空,if 语句就会触发,这显然不是您想要的。

    你应该检查返回数组的内容:

    BOOL succeeded = NO;
    NSArray *results = [dataArray valueForKey:@"success"];
    for (NSObject *obj in results) {
        succeeded = [obj isKindOfClass:[NSNumber class]] && [(NSNumber *)obj boolValue];
        if (succeeded)
            break;
    }
    if (succeeded) {
        [self.feedsArray addObjectsFromArray:dataArray];
        NSLog(@"self.feedsArray: %@",self.feedsArray);
    } else {
        NSLog(@"no feed found ");
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过简单的方式做到这一点: 我在您的响应 json 值中看到的是,您在索引 0 处的 dataArray 中有字典

       NSMutableDictionary *responseDict = [dataArray objectAtIndex:0];
       if([[responseDict objectForKey:@"success"] boolValue])
       {
            NSLog(@"Success: 1");
       }
       {
            NSLog(@"Success: 0");
       }
      

      【讨论】:

        【解决方案3】:

        对数组使用索引而不是键。

        NSDictionary dictionary = (NSDictionary *)dataArray[0];
        if ([(NSNumber *)[dictionary objectForKey:@"success"] boolValue]) {
            // ...
        } 
        

        【讨论】:

        • if ([(NSNumber *)[dataArray valueForKey:@"success"] boolValue]) {...} -[__NSArrayI boolValue]: 无法识别的选择器发送到实例 0x762e210 *** 终止应用程序到期未捕获的异常 'NSInvalidArgumentException',原因: ' - [__ NSArrayI boolValue]:发送到实例0x762e210无法识别选择' ***第一掷调用堆栈:(0x16a5012 0x13b2e7e 0x17304bd 0x1694bbc 0x169494e 0xb3b9 0x24bd53f 0x24cf014 0x24bf7d5 0x164baf5 0x164af44 0x164ae1b 0x27067e3 0x2706668 0x2f6ffc 0x20ad 0x1fd5) libc++abi.dylib:终止调用抛出异常
        • 更新了我的答案。对数组使用索引而不是键。
        • [[dataArray objectAtIndex:0] boolForKey:@"success"] 仍然崩溃
        【解决方案4】:

        否则使用if([[[dataArray objectAtIndex:0] valueForKey:@"success"] isEqualToString:@"1"])

        【讨论】:

        • 你怎么知道会是@"1"
        • 成功可能是 1 或 0 na?
        • 我用那个应用在这条线上崩溃了
        • 什么是崩溃日志?
        • 出于显而易见的原因,它将是“发送到实例的无法识别的选择器”。
        【解决方案5】:

        数组不存储键,访问数组中项目的唯一方法是通过索引。 您应该改用 NSDictionary/NSMutableDictionary。如果你想使用 bool 将其存储为 NSNumber,[NSNumber numberWithBool:YES] 然后使用实例方法 valueForBool 读取它。

        【讨论】:

        • 它说“返回一个数组,其中包含调用 valueForKey 的结果:在每个数组对象上使用键。”它返回一个数组,而不是布尔值,用于键值编码。从所示示例中,这看起来不像 OP 所需要的。
        • 好吧,OP 必须澄清一下,但在我看来,这正是他想要的。
        • 是的 - 不知道为什么要对数组执行“if”,那不是总是返回 true(假设数组本身不是 nil)吗?
        • 是的;请参阅我的答案,了解如何正确处理返回的数组。
        【解决方案6】:

        试试这个

        if ([[dataArray valueForKey:@"success"]isEqualToString:@"1"]) {
             [self.feedsArray addObjectsFromArray:dataArray];
             NSLog(@"self.feedsArray: %@",self.feedsArray);
        }
        else {
             NSLog(@"no feed found ");
        }
        

        会解决的。

        【讨论】:

        • 2013-08-29 15:42:31.196 test[4375:c07] -[__NSArrayI isEqualToString:]:无法识别的选择器发送到实例 0x8185d90 2013-08-29 15:42:31.197 test[4375 :C07] ***由于未捕获的异常'nsinvalidargumentException'而终止应用程序,原因:' - [__ nsarrayi是否arequaltoring:]:未识别选择器发送到实例0x8185d90'***首先投掷呼叫堆栈:( 0x16a5012 0x13b2e7e 0x17304bd 0x1694bbc 0x169494e 0xb3a1 0x24bd53f 0x24cf014 0x24bf7d5 0x164baf5 0x164af44 0x164ae1b 0x27067e3 0x2706668 0x2f6ffc 0x208d 0x1fb5)libc++abi.dylib:终止调用抛出异常(lldb)
        【解决方案7】:

        如果你想要布尔值,请使用它

        if([[dataArray valueForKey:@"success"] boolValue])
        {
        //i.e success is true 
        }
        

        如果响应包含字典数组,那么我们可以使用循环和检查条件, 这里 i 是数组的索引变量,

        if([[[dataArray objectAtIndex:i] objectForKey:@"success"] boolValue])
        {
        // success is true , 
        }
        

        【讨论】:

        • 我已经尝试过了,应用程序因这段代码而崩溃。
        【解决方案8】:

        替换你的代码行

         if ([dataArray valueForKey:@"success"]) {
        }
        

         if ([[dataArray valueForKey:@"success"] integerValue]) {
        }
        

        希望它对你有用。

        【讨论】:

          【解决方案9】:

          它可以用

          替换该行
          if ([[[dataArray objectAtIndex:0] valueForKey:@"success"] boolValue])
          

          【讨论】:

            猜你喜欢
            • 2012-03-25
            • 2018-03-03
            • 2011-04-13
            • 2023-04-07
            • 2013-06-28
            • 2017-04-08
            • 2012-06-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多