Objective c 比较NSStrings和有关NSNumbers的警告

Objective c 比较NSStrings和有关NSNumbers的警告,objective-c,ios,cocoa-touch,comparison,compiler-warnings,Objective C,Ios,Cocoa Touch,Comparison,Compiler Warnings,有时JSON从它获取数据的数据库返回(null),所以我检查它是否返回了(null) 但是Xcode在警告我 不兼容的Objective-C类型“struct NSString*”,在从不同的Objective-C类型传递参数1“compare:”时应为“struct NSNumber*” 我将NSStrings添加到该数组中,所以我不明白它为什么要谈论结构 NSString *clubNameReturned = [message objectForKey:@"clubname"]; [clu

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

但是Xcode在警告我

不兼容的Objective-C类型“struct NSString*”,在从不同的Objective-C类型传递参数1“compare:”时应为“struct NSNumber*”

我将
NSString
s添加到该数组中,所以我不明白它为什么要谈论结构

NSString *clubNameReturned = [message objectForKey:@"clubname"];
[clubsArray addObject:clubNameReturned];
有人能解释一下这里发生了什么吗

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

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


[NSNull null]
进行比较,这是因为
比较:
方法的定义是:

- (NSComparisonResult)compare:(NSNumber *)otherNumber;
因此,它需要一个NSNumber对象,但您正在传递一个NSString

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

else if ([[clubsArray objectAtIndex:indexPath.row] isEqualToString:@"(null)"])
但是,它可能不会返回字符串(尽管打印到控制台时会看到该字符串),因此您应该执行以下操作:

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

如果您明确表示沮丧,警告将消失,例如:

if(nsOrderedName=[(NSString*)[clubsArray objectAtIndex:indexPath.row]比较:@“(null)”)


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

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


您有错误:
NSLog(@“%@”,nil)打印
(null)
NSLog(@“%@,[NSNull-null])打印
else if ([clubsArray objectAtIndex:indexPath.row] == [NSNull null])