Ios 正在将id解析为NSString
在解析API响应时,有时我不能依赖于引号中嵌入的字符串。ID是一个很好的例子,其中一些API将数字ID作为字符串发送,而一些API将数字ID作为数字发送 解析这样的值时,什么是好的做法?如果我简单地将其解析为一个Ios 正在将id解析为NSString,ios,objective-c,nsstring,Ios,Objective C,Nsstring,在解析API响应时,有时我不能依赖于引号中嵌入的字符串。ID是一个很好的例子,其中一些API将数字ID作为字符串发送,而一些API将数字ID作为数字发送 解析这样的值时,什么是好的做法?如果我简单地将其解析为一个NSString,如下所示: NSString *myID = (NSString *)message["myID"]; 我可以得到一个NSString对象,它以某种方式包含(long)123 当值实际上已经作为字符串发送时,使用stringValue会导致问题(因为NSString没
NSString
,如下所示:
NSString *myID = (NSString *)message["myID"];
我可以得到一个NSString
对象,它以某种方式包含(long)123
当值实际上已经作为字符串发送时,使用stringValue
会导致问题(因为NSString
没有stringValue
功能)
一种可行但有点丑陋的方法是:
id myID = (NSString *)message["myID"];
if ([myID respondsToSelector:@selector(stringValue)])
{
myID = [myID stringValue];
}
你可以这样做:
id myID = message["myID"];
if ([myID isKindOfClass:[NSString class]]) { ... }
else { ... }
你可以这样做:
id myID = message["myID"];
if ([myID isKindOfClass:[NSString class]]) { ... }
else { ... }
只要此逻辑封装在数据解析器中,并且对api用户来说是不透明的(即,他们总是会得到一个字符串),任何方法都可以,例如:
- (NSString*)parseID:(NSDictionary*)message {
id rawID = message["myID"];
if ([rawID isKindOfClass:[NSString class]]){
return rawID;
} else if ([rawID isKindOfClass:[NSNumber class]]) {
return [(NSNumber*)rawID stringValue];
} else {
// We might still want to handle this case.
NSAssert(false, @"Unexpected id type");
return nil;
}
}
只要此逻辑封装在数据解析器中,并且对api用户来说是不透明的(即,他们总是会得到一个字符串),任何方法都可以,例如:
- (NSString*)parseID:(NSDictionary*)message {
id rawID = message["myID"];
if ([rawID isKindOfClass:[NSString class]]){
return rawID;
} else if ([rawID isKindOfClass:[NSNumber class]]) {
return [(NSNumber*)rawID stringValue];
} else {
// We might still want to handle this case.
NSAssert(false, @"Unexpected id type");
return nil;
}
}
另一种方法是在extension中定义stringValue,这样任何可能的objet都将响应选择器:
@implementation NSString(JSONStringParsing)
- (NSString *)stringValue {
return [self copy];
}
@end
另一种方法是在extension中定义stringValue,这样任何可能的objet都将响应选择器:
@implementation NSString(JSONStringParsing)
- (NSString *)stringValue {
return [self copy];
}
@end
为什么不直接使用
说明
NSArray *objects = @[
@NSIntegerMin,
@NSIntegerMax,
@"123456789"
];
for (id object in objects) {
NSString *stringObject = [object description];
NSLog(@"%@ -> %@ | %@", [object className], [stringObject className], stringObject);
}
为什么不直接使用
说明
NSArray *objects = @[
@NSIntegerMin,
@NSIntegerMax,
@"123456789"
];
for (id object in objects) {
NSString *stringObject = [object description];
NSLog(@"%@ -> %@ | %@", [object className], [stringObject className], stringObject);
}
响应是协议。它应该总是相同的,或者在服务器端必须有非常具体的原因@superx3man的答案似乎很简单,但在执行此操作之前,您最好先与服务器端联系。您不能将
长的
存储在字典中。当然,它可能是一个表示长的NSNumber的NSNumber
。响应是协议。它应该总是相同的,或者在服务器端必须有非常具体的原因@superx3man的答案似乎很简单,但在执行此操作之前,您最好先与服务器端联系。您不能将长的
存储在字典中。当然,它可以是一个表示长代码的NSNumber。