【发布时间】:2014-01-19 19:21:00
【问题描述】:
我有一个注册新用户的 JSON 服务。当出现“E-mail in use”或“Taken user name”等错误时,返回以“|”分隔的错误码字符(字符串)。注册成功后,返回注册用户的ID(整数)。
例如,注册的电子邮件和用户名(在一种情况下)错误将返回:
{"error" = "200|300|";}
成功注册会返回:
{"error" = 1234;}
所以我用“|”分割错误字符放入数组,然后显示如下错误:
NSArray *errorCodes = [[jsonData objectForKey:@"error"] componentsSeparatedByString:@"|"];
当有错误/有错误时,这条线很好用。但是当没有错误时,这行代码崩溃如下:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber componentsSeparatedByString:]: unrecognized selector sent to instance 0x7579fc0'
如果我没记错的话,它会崩溃,因为它试图拆分一个实际上不是字符串而是数字的字符串。
所以我尝试通过检查对象类的类型来解决这个问题,例如:
if ([[jsonData objectForKey:@"error"] isKindOfClass:[NSNumber class]]) {
// success
} else if ([[jsonData objectForKey:@"error"] isKindOfClass:[NSString class]])
// show errors
}
但是,这些声明都没有涉及。当我尝试检查 [__NSCFNumber class] 而不是 [NSNumber class] 时,它返回错误:
Unknown receiver '__NSCFNumber'; did you mean 'NSNumber'?
[NSString class] 也一样。
如何通过检查对象类型来解决这个问题?我知道我可以使用其他方式,但这种方式似乎是正确的方式,因为我将来可能需要对不同的数据类型进行这种控制。
【问题讨论】:
-
任何更改 API 响应的机会 - 这感觉不是通知客户请求结果的最清晰和最简单的方法。第一步是遵循 REST 约定并返回合适的 HTTP 状态代码 - 例如。 201 成功创建 400 错误
-
@rist 我同意你的观点,但是我只是客户,没有这个机会。我也不会在错误代码中发送成功消息...
-
如果它没有进入你的 if 语句,记录它的类。
标签: ios objective-c json nsstring nsnumber