在目标C中检查isKindOfClass是否多余?

问题描述

即使在目标C中检查非id变量,是否也需要检查isKindOfClass吗?

团队成员编写了Swift代码。我正在审查。我真的需要检查条件中的isKindOfClass还是多余?

-(void) checkCalorie:(NSMutableDictionary *) update {

    Nsstring *foodInfoId = [update objectForKey:FOOD_INFO_ID];
    double calorie = [[update objectForKey:CALORIE] doubleValue];
    if ([foodInfoId isKindOfClass:[Nsstring class]] && calorie < 0)
    {
        calorie = 0.0;
        // some logic
    }
}

解决方法

我认为您应该使用为Objective-C实现的dynamic_cast重构此代码。您可以检查this question以获得灵感。例如,使用this answer中的objc_dynamic_cast,那么您将获得以下代码:

-(void)checkCalorie:(NSMutableDictionary *)update {
    NSString *foodInfoId = objc_dynamic_cast([update objectForKey:FOOD_INFO_ID],NSString);
    double calorie = [[update objectForKey:CALORIE] doubleValue];
    if (foodInfoId != nil && calorie < 0) {
        calorie = 0.0;
        // some logic
    }
}