【问题标题】:Parsing id to NSString将 id 解析为 NSString
【发布时间】:2018-06-21 04:22:21
【问题描述】:

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

解析这样的值时有什么好的做法?如果我像这样简单地将其解析为NSString

NSString *myID = (NSString *)message["myID"];

我最终可以得到一个包含(long)123NSString 对象。

当值实际上已经作为字符串发送时,使用stringValue 会导致问题(因为NSString 没有stringValue 函数)。

一种可行但有点难看的方法是这样的:

id myID = (NSString *)message["myID"];
if ([myID respondsToSelector:@selector(stringValue)])
{
    myID = [myID stringValue];
}

【问题讨论】:

  • 响应是协议。它应该始终相同,或者服务器端必须有非常具体的原因。 @superx3man 的答案似乎很容易解决,但您最好在执行此操作之前与服务器端交谈。
  • 您不能将long 存储在字典中。当然它可以是一个NSNumber 代表一个long

标签: ios objective-c nsstring


【解决方案1】:

你可以这样做:

id myID = message["myID"];
if ([myID isKindOfClass:[NSString class]]) { ... }
else { ... }

【讨论】:

    【解决方案2】:

    只要这个逻辑被封装在数据解析器中并且对你的 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;
       }
    }
    

    【讨论】:

      【解决方案3】:

      另一种方法是在扩展中定义stringValue,这样任何可能的对象都会响应选择器:

      @implementation NSString(JSONStringParsing)
      - (NSString *)stringValue {
          return [self copy];
      }
      @end
      

      【讨论】:

        【解决方案4】:

        为什么不直接使用description

        NSArray *objects = @[
                @NSIntegerMin,
                @NSIntegerMax,
                @"123456789"
                ];
        for (id object in objects) {
            NSString *stringObject = [object description];
            NSLog(@"%@ -> %@ | %@", [object className], [stringObject className], stringObject);
        }
        

        【讨论】:

          猜你喜欢
          • 2012-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多