比较NSStrings和有关NSNumbers的警告

时间:2011-06-20 19:25:56

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

有时JSON会从获取数据的数据库返回(null),因此我会检查它是否返回了(null)

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

但Xcode警告我

  

不兼容的Objective-C类型'struct NSString *',当从不同的Objective-C类型传递'compare:'的参数1时,预期'struct NSNumber *'

我将NSString添加到该数组中,所以我对它为什么讨论结构感到困惑。

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

有人能够对这里发生的事情有所了解吗?

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

4 个答案:

答案 0 :(得分:5)

JSON不返回“(null)”字符串。此字符串“(null)”仅是NSLog空单例对象(它是description表示)时控制台上显示的内容。

[NSNull null]进行比较,而不是a singleton especially used to store something that represent the null/nil value on containers

答案 1 :(得分:1)

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

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

所以它期待一个NSNumber对象,但是你传递了一个NSString。

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

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

然而,它可能不会返回一个字符串(尽管这是你在打印到控制台时所看到的),所以你应该这样做:

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

答案 2 :(得分:0)

如果您明确贬低,警告将消失,例如:

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

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

答案 3 :(得分:0)

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

TouchJSON, dealing with NSNull