使用 BOOL 替换冗长的代码

Using a BOOL to replace verbose code

我有一行可怕的代码,它是一个巨大的 PITA,需要反复输入和阅读。我试图在我的 class 中用一个漂亮、整洁的 BOOL 属性 和相应的方法替换它,但它是 "flakey"(并且它没有崩溃)。我想用更整洁的东西代替这个可怕的怪物。这是我到目前为止所做的。

这是有效的...

    if (self.stretchSideMultiplierCount < [[[NSUserDefaults standardUserDefaults]valueForKey:@"stretchMultiplier"]integerValue] * self.currentStretch.sideMultiplier.integerValue) {
        // blah blah blah
    }

...但它看起来很可怕,所以我试图通过在实现中创建一个 BOOL 属性 来摆脱它:

@property (nonatomic, assign) BOOL lastRoundOfCurrentStretch;

...以及下面的方法...

- (BOOL) lastRoundOfCurrentStretch {
    if (self.currentStretch.sideMultiplier.intValue * [[[NSUserDefaults standardUserDefaults]valueForKey:@"defaultStretchRepetition"]intValue] == self.stretchSideMultiplierCount) {
        NSLog(@"** LAST ROUND **");
        return YES;
    } else {
        return NO;
    }
}

完成后,我希望能够使用此 BOOL 作为替代方法,而不是在查询顶部键入可怕的代码行。

if (self.lastRoundOfCurrentStretch == NO) {
    // blah blah blah
}

在我进行更改后,class 不再像 "used to" 那样工作,但它没有崩溃。我敢肯定,这归结为我犯了一个非常愚蠢的用户错误,但我很快就找不到答案了。这与我得到的适用于我正在尝试做的事情的答案一样接近。

Using a BOOL property

在第一行代码中,您使用的是 <,而在更新后的代码中,您使用的是 == 我怀疑这会导致不良行为?

您在 属性 的 getter 中使用“==”而不是“<”,您确定下面的代码与上面的代码相同吗?

你原来的代码可以重写为

NSInteger stretchMultiplier = [[[NSUserDefaults standardUserDefaults]valueForKey:@"stretchMultiplier"]integerValue];
NSInteger sideMultiplier = self.currentStretch.sideMultiplier.integerValue;
if (self.stretchSideMultiplierCount < stretchMultiplier * sideMultiplier) {
  // blah blah blah
}

你的属性getter可以重写为:

- (BOOL) lastRoundOfCurrentStretch {
    NSInteger defaultStretchRepetition = [[[NSUserDefaults standardUserDefaults]valueForKey:@"defaultStretchRepetition"]integerValue];
    NSInteger sideMultiplier = self.currentStretch.sideMultiplier.integerValue;

    return (defaultStretchRepetition * sideMultiplier == self.stretchSideMultiplierCount);
}

你现在能看出区别了吗?您正在加载与用户默认值不同的变量。一旦您使代码更具可读性,这一点就很明显了。