Цель C: Как проверить тип объекта без большого количества операторов if - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь установить строку text в URL.Следующий код работает, но я чувствую, что могу изменить его, чтобы он выглядел аккуратнее.

NSString *text = @“”;

id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];

if ([json isKindOfClass:[NSDictionary class]]) {

   id data = json[@“data”];

    if ([data isKindOfClass:[NSDictionary class]]) {
       id value = data[@"value"];

       if ([value isKindOfClass:[NSArray class]]) {
            id url = [value valueForKey:@"url"];

          if ([url isKindOfClass:[NSString class]]) {
             text  = url;
         }
       }
     }
   } 

Пока что происходит "гора гибели", и я хочу знать, как я могу проверить правильность типа объекта, не используя так много операторов if.Любые советы или предложения приветствуются.

Редактировать: Это облегченная версия моего кода, но концепция та же.

1 Ответ

0 голосов
/ 22 мая 2018

По моему мнению, есть 2 способа сделать его более аккуратным и игнорировать if-else-nesting-hell.

  • Использование return.

    NSString *text = @“”;
    
    id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
    
    if (![json isKindOfClass:[NSDictionary class]]) {
      return;
    }
    id data = json[@“data”];
    
    if (![data isKindOfClass:[NSDictionary class]]) {
      return;
    }
    id value = data[@"value"];
    
    if (![value isKindOfClass:[NSArray class]]) {
      return;
    }
    id url = [value valueForKey:@"url"];
    
    if (![url isKindOfClass:[NSString class]]) {
      return;
    }
    text  = url;
    
  • Создать универсальный метод, который проверяет тип класса и возвращает безопасное значение

    - (id)safeValueFromObject:(id)object forKey:(NSString *)key class:(Class)valueClass {
      if (![object respondsToSelector:@selector(valueForKey:)]) {
        return [[valueClass alloc] init];
      }
    
      id result = [object valueForKey:key];
      return [result isKindOfClass:valueClass] ? result : [[valueClass alloc] init];
    }
    

    Использование

    NSString *text = @"";
    
    id json = [NSJSONSerialization JSONObjectWithData:[data dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil];
    id data = [self safeValueFromObject:json forKey:@"data" class:NSDictionary.class];
    id value = [self safeValueFromObject:data forKey:@"value" class:NSArray.class];
    id url = [self safeValueFromObject:value forKey:@"url" class:NSString.class];
    text  = url;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...