3

我有一个对象的初始化程序:

-(id)init
{
    self = [super init];
    if (self) {
        if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
            _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
        }
        if([[NSUserDefaults standardUserDefaults] objectForKey:kInitialSetupCompleted] != nil){
            _initialSetupCompleted = [[NSUserDefaults standardUserDefaults] boolForKey:kInitialSetupCompleted];
        }
        if([[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage] != nil){
            _dashboardMessage = [[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage];
        } else{
            _dashboardMessage = [[NSBundle mainBundle] localizedStringForKey:kDMDefaultDashboardMessage value:kDMDefaultDashboardMessage table:nil];
        }
        //50 other if statements
    }
    return self;
}

有什么更好的方法可以做到这一点,这样我在进行 OCLint 分析时就不会收到这些警告?

谢谢!

4

1 回答 1

5

所有实例变量都初始化为 0;这意味着BOOLs 被初始化为NO。因此效果:

if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
    _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}

...是:如果有存储值,则设置_termsAccepted为它。否则_termsAcceptedNO

boolForKey:有一个记录的返回值:

如果布尔值与用户默认值中的 defaultName 相关联,则返回该值。否则,NO返回。

因此,与 just 进行比较和对比:

_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];

...在这种情况下,最终结果将是:如果有存储值,则设置_termsAccepted为它。否则_termsAcceptedNO

因此,为了降低圈复杂度,请删除if语句。他们什么都不加。

编辑:正确地指出,我错过了BOOLs 并非专门使用的事实。

用于-[NSUserDefaults registerDefaults:]建立您的后备值。一旦设置,它们就会保存在内存中,但不会写入存储。然后用户默认自己将为所有类型的对象处理“如果没有存储值,则使用此值”的情况。

于 2016-03-16T18:32:13.477 回答