【问题标题】:Objective C: comparing dictionary contents目标 C:比较字典内容
【发布时间】:2013-01-21 18:53:16
【问题描述】:

我有一个字典声明,像这样,

NSString *responseString = [request responseString];
            responseDict = [responseString JSONValue];
            for (id key in responseDict){
                NSLog(@"%@ : %@", key, [responseDict objectForKey:key]);
            }

结果:

013-01-22 00:14:02.323 PromoTest[2352:c07] A : 0
2013-01-22 00:14:02.325 PromoTest[2352:c07] B : 1
2013-01-22 00:14:02.325 PromoTest[2352:c07] C : 0

现在,我想比较该值并对其进行一些操作。我假设键的值是 NSString 类型,并将其与我的常量 NSString 进行比较,就像这样,

NSString *myString1 = @"0";     
NSString *myString2 = [responseDict objectForKey:@"A"];

NSLog(@"%d", (myString1 == myString2)); //1
NSLog(@"%d", [myString1 isEqualToString:myString2]); //1

结果:

2013-01-22 00:19:12.966 PromoTest[2423:c07] 0
2013-01-22 00:19:12.966 PromoTest[2423:c07] 0

我哪里错了??我的比较有错吗?如何正确比较内容??
数据作为响应数据从 Web 服务接收。我只是将数据转换成字典以便于使用它。 Web 服务返回一个 JSON 对象,

{"A":0,"B":1,"C":0}

【问题讨论】:

  • «我假设键的值是 NSString 类型» 看起来这种假设可能是错误的。你应该先验证它。那就看看Understanding NSString comparison
  • 任何合理的 JSON 解析器都应该将数字映射到 NSNumber 而不是 NSString。如果乍一看这对您来说并不明显,请阅读您正在使用的 JSON 解析器的文档。
  • 默认obj-c dict中键和值的类型是id
  • id 只是为了方便说实际类型可以是任何对象类型。
  • @ttt:对象仍然拥有并且知​​道它们的类。 id 是一种变量类型,可以保存指向任何对象的指针。

标签: objective-c nsstring nsdictionary


【解决方案1】:

NSDictionary方法isEqualToDictionary可以用来比较两个字典

返回一个布尔值,指示是否 接收字典等于另一个给定的内容 字典。

例如:

[myDictionary isEqualToDictionary:expectedDictionary]

【讨论】:

    【解决方案2】:

    唯一合理的解释是[responseDict objectForKey:@"A"] 没有返回NSString

    您可能收到了NSNumber 回复,因此比较失败。

    如果是这种情况,您需要先从NSNumber 获取NSString,然后再将其与常量进行比较。你可以这样做

    NSString * myString2 = [[responseDict objectForKey:@"A"] stringValue];
    

    也永远不要使用== 来比较NSStrings 实例。坚持isEqualToString,你会很好的。

    【讨论】:

      【解决方案3】:

      除了比较字符串,您还可以比较数字对象。这里包括一个检查,如果返回的对象是一个 NSNumber,如果不是,尝试作为字符串:

      if([responseDict[@"A"] isKindOfClass:[NSNumber class]]){
          NSNumber *myNumber1 = @0;     
          NSNumber *myNumber2 = [responseDict objectForKey:@"A"];
          NSLog("Same number: %@",[myNumber1 isEqualToNumber:myNumber2] ? @"YES" : @"NO");
      
      } else if([responseDict[@"A"] isKindOfClass:[NSString class]]){
          NSString *myString1 = @"0";     
          NSString *myString2 = [responseDict objectForKey:@"A"];
          NSLog("Same string: %@",[myString1 isEqualToString:myString2] ? @"YES" : @"NO");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-06-15
        相关资源
        最近更新 更多