有时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];
有人能够对这里发生的事情有所了解吗?
代码按照我的预期执行,但我不想做一些不正确的事情。
答案 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数据中的空值: