【问题标题】:Comparing NSStrings and warning about NSNumbers比较 NSStrings 和关于 NSNumbers 的警告
【发布时间】:2011-09-18 23:15:16
【问题描述】:

有时 JSON 从它获取数据的数据库中返回 (null),所以我检查它是否返回了 (null)

else if (NSOrderedSame == [[clubsArray objectAtIndex:indexPath.row] compare:@"(null)"] )

但是 Xcode 警告我

从不同的 Objective-C 类型传递“比较:”的参数 1 时,不兼容的 Objective-C 类型“struct NSString *”,预期为“struct NSNumber *”

我将NSStrings 添加到该数组中,所以我很困惑它为什么谈论结构。

NSString *clubNameReturned = [message objectForKey:@"clubname"];
[clubsArray addObject:clubNameReturned];

有人能解释一下这里发生了什么吗?

代码按我的预期执行,但我不想做不正确的事情。

【问题讨论】:

    标签: objective-c ios cocoa-touch comparison compiler-warnings


    【解决方案1】:

    JSON 不返回“(null)”字符串。这个字符串 "(null)" 只是当你 NSLog 空单例对象(它是description 表示)时在控制台上显示的内容。

    改为与[NSNull null] 比较,即a singleton especially used to store something that represent the null/nil value on containers

    【讨论】:

    • 你错了:NSLog(@"%@", nil); 打印出(null)NSLog(@"%@", [NSNull null]); 打印出<null>
    【解决方案2】:

    那是因为compare:方法的定义是:

    - (NSComparisonResult)compare:(NSNumber *)otherNumber;
    

    所以它需要一个 NSNumber 对象,但你传递的是一个 NSString。

    如果要检查 2 个 NSString 是否相同,请使用 isEqualToString: 方法:

    else if ([[clubsArray objectAtIndex:indexPath.row] isEqualToString:@"(null)"])
    

    但是,它可能不会返回一个字符串(尽管这是您在打印到控制台时看到的),因此您应该这样做:

    else if ([clubsArray objectAtIndex:indexPath.row] == [NSNull null])
    

    【讨论】:

      【解决方案3】:

      如果您明确表示不满意,警告将消失,例如:

      if (NSOrderedSame == [(NSString *)[clubsArray objectAtIndex:indexPath.row] compare:@"(null)"] )

      发生的情况是您在[clubsArray objectAtIndex:indexPath.row] 的结果上调用compare: 方法,该结果是id 类型。现在,允许从 id 到任何其他类型的隐式向下转换......但在你的情况下,编译器无法告诉你想要的确切类型。是NSNumber 还是NSString 还是NSDate...? (顺便说一句,NSObject 不回复compare:)。这是一个警告,因为编译器认为您将在运行时提供正确的类型(您会这样做!),但它告诉您应该更明确地使用这种代码。

      【讨论】:

        【解决方案4】:

        我建议你使用 NSDictionary 上的这个类别来处理 JSON 数据中的空值:

        TouchJSON, dealing with NSNull

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多