我有以下从块返回的响应:
response: {
error = "";
success = 1;
}
我试图评估"成功",但它永远不会像"else"一样等于 1:
NSLog(@"response: %@", responseObject);
NSInteger success = (NSInteger)responseObject[@"success"];
NSString *errorMessage = (NSString *)responseObject[@"error"];
if (success == 0) {
NSLog(@"success is false");
NSLog(@"JSON: %@", errorMessage);
saveCallback(NO, [self createErrorFromDescription:errorMessage]);
}else if (success == 1){
NSLog(@"success is true");
saveCallback(YES, nil);
}else{
NSLog(@"success is else");
NSLog(@"JSON: %@", errorMessage);
saveCallback(NO, [self createErrorFromDescription:errorMessage]);
}
我做错了什么?
NSInteger
是一个基元,id
是一个对象(实际上是指向对象的指针(,在这种情况下可能是NSNumber
。
直接将指针强制转换为对象,NSInteger不会将其转换为整数值类型,它只会将指针内存重新解释为整数。
若要将 number 对象转换为整数值,请对其调用integerValue
。
(也可能是响应中缺少该数字,或者它可能作为 NSNull 对象返回,因此下面的错误检查(
NSNumber *successNumber = responseObject[@"success"];
NSInteger success;
if (!successNumber || successNumber == [NSNull null]) {
// the response doesn't contain anything for the "success" key :(
}
// if successNumber is nil, this will be 0.
// if successNumber is the NSNull object, this will crash (unrecognized selector)
// Just be aware of both of those.
success = [successNumber integerValue];
NSInteger success = [responseObject[@"success"] integerValue];
鉴于您似乎正在使用原始 json,您需要非常小心不要使用 NULL 值;这将导致异常。
由于目标 C 中有许多类型的 Null,因此最好使用类自检来确保对象有效。
NSDictionary *responseArray = responseObject;
NSInteger success=0;
if([responseObject isKindOfClass:[NSDictionary class]])
{
// responseObject is safe to subscript
NSNumber *successNumber = responseObject[@"success"];
// Use introspection; messaging nil doesn't cause an exception and returns nil
if ([successNumber isKindOfClass:[NSNumber class]])
{
// NSInteger is a primitive
success = [successNumber integerValue];
}
}
// If success is anything but zero, assume it's true
if (success)
{
NSLog(@"success is true");
}
else
{
NSLog(@"success is false");
}
据推测,您的成功键是 1 或 0,因此您可以稍微简化此代码。不过,一般来说,这就是您希望处理可能为 NULL 而不是简单地为 nil 的对象的方式。