Ios 正在将id解析为NSString

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没

在解析API响应时,有时我不能依赖于引号中嵌入的字符串。ID是一个很好的例子,其中一些API将数字ID作为字符串发送,而一些API将数字ID作为数字发送

解析这样的值时,什么是好的做法?如果我简单地将其解析为一个
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。