使用 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);
}
你现在能看出区别了吗?您正在加载与用户默认值不同的变量。一旦您使代码更具可读性,这一点就很明显了。
我有一行可怕的代码,它是一个巨大的 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);
}
你现在能看出区别了吗?您正在加载与用户默认值不同的变量。一旦您使代码更具可读性,这一点就很明显了。