在 Objective C 中不使用 switch 语句显示评级图像的最佳实践

Best practice to display rating image without using switch statement in Objective C

我有一个 table 视图,其中有许多地方的评分是使用解析中的云代码计算的。我目前使用 switch 语句根据获得的评分显示图像。这是我当前的代码。

[PFCloud callFunctionInBackground:@"calculateRating"
                   withParameters:@{@"place":cell.placeName.text}
                            block:^(NSNumber *ratings, NSError *error) {
                                if (!error) {
                                    NSLog(@"%@ has %d starts",cell.placeName.text,[ratings intValue]);
                                    rating = [ratings intValue];
                                    switch(rating) {
                                        case 1:
                                            cell.ratingImage.image=[UIImage imageNamed:@"1Stars.png"];
                                            break;
                                        case 2:
                                            cell.ratingImage.image=[UIImage imageNamed:@"2Stars.png"];
                                            break;
                                        case 3:
                                            cell.ratingImage.image=[UIImage imageNamed:@"3Stars.png"];
                                            break;
                                        case 4:
                                            cell.ratingImage.image=[UIImage imageNamed:@"4Stars.png"];
                                            break;
                                        case 5:
                                            cell.ratingImage.image=[UIImage imageNamed:@"5Stars.png"];
                                            break;

                                        default:
                                            break;
                                    }

                                }

                        }];

我尝试了以下代码来解决问题,但它不起作用。

NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",(int) ratings];
                                    cell.ratingImage.image=[UIImage imageNamed:ratingImageName];

我收到以下错误。 -[NSNull intValue]: 无法识别的选择器发送到实例 0x108572ce0

谁能帮我根据检索到的评分显示我拥有的 5 个评分图像的最佳方法?

每当你看到这样的switch,想想"array"。

创建一个 NSArray,以 kStars.png 位于索引 k 的方式用图像预填充它,并将其放入实例变量中:

_ratingImages = @[
    [UIImage imageNamed:@"0Stars.png"]
,   [UIImage imageNamed:@"1Stars.png"]
,   [UIImage imageNamed:@"2Stars.png"]
,   [UIImage imageNamed:@"3Stars.png"]
,   [UIImage imageNamed:@"4Stars.png"]
,   [UIImage imageNamed:@"5Stars.png"]
];

现在您可以用一个赋值替换开关:

cell.ratingImage.image=_ratingImages[rating];

这种方法的一个重要优点是图像只创建一次,并缓存在 class 实例上。这使您免于不必要的查找和对象构造。

注意:如果您想让代码正常工作,它不起作用的原因是您使用的是强制转换而不是调用 intValue:

NSString *ratingImageName=[NSString stringWithFormat:@"%dStars.png",[ratings intValue]];

希望这段代码能在一行中解决问题。 [UIImage imageNamed:[NSString stringWithFormat:@"%dStars.png",rating]];