NSDictionary получить значение в виде строки, не жалуется, но длина длина или isEqualToString падает - PullRequest
0 голосов
/ 01 апреля 2019

Я получил Json, как показано ниже, в качестве ответного сообщения.

data:{
    type = DATA;
    version = "4.51";
}

То, что я обрабатываю по методу ниже, из отладчика выглядит так, что версия не является строкой.

-(void)processResponse:(NSDictionary *)responseDictionary{
    NSString *version = [responseDictionary valueForKey:@"version"];
    if([version isEqualToString:@"4.51"]){ //line 3
        NSLog(@"do something"); //crashes
    }
}

Но строка 3 вылетает.У меня вопрос, почему эта линия падает?И каков наилучший способ обработки словарных сообщений такого типа?

1 Ответ

1 голос
/ 01 апреля 2019

Если это данные, созданные за пределами вашей программы, вы всегда должны проверять типы.

-(void)processResponse:(NSDictionary *)responseDictionary {
    id value = responseDictionary[@"version"];
    if ([value isKindOfClass: [NSString class]]) {
        NSString *version = value;
        if ([version isEqualToString: @"4.51"]) {
            NSLog(@"do something"); //crashes
        }
    }
}

Если это все, что вы собираетесь сделать, то вы можете немного сократить его с помощью короткого замыкания &&, если вы осторожны.

-(void)processResponse:(NSDictionary *)responseDictionary {
    NSString *version = responseDictionary[@"version"];
    if ([version isKindOfClass: [NSString class]] 
        && [version isEqualToString: @"4.51"]) {

        NSLog(@"do something"); //crashes
    }
}

Просто будьте очень осторожны с этим, потому что это означает, что version существует за пределами этого блока if и может быть неправильного типа.

Опять же, если это именно ваша проблема, вы также можете упростить ее, используя isEqual:, что относится ко всем NSObject:

-(void)processResponse:(NSDictionary *)responseDictionary {
    id version = responseDictionary[@"version"];
    if ([version isEqual: @"4.51"]) {
        NSLog(@"do something"); //crashes
    }
}
...