如何从NSUserDefaults初始化时降低高圈复杂度

Jan*_*Jan 3 optimization static-analysis lint objective-c oclint

我有一个对象的初始化器:

-(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;
}
Run Code Online (Sandbox Code Playgroud)

什么是更好的方法这样做,所以我在进行OCLint分析时没有得到这些警告?

谢谢!

Tom*_*mmy 5

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

if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
    _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
Run Code Online (Sandbox Code Playgroud)

...是:如果存储了值,则设置_termsAccepted为它.否则_termsAccepted就会NO.

boolForKey: 记录的返回值为:

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

所以比较和对比只是:

_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
Run Code Online (Sandbox Code Playgroud)

...在这种情况下,最终结果将是:如果存储了值,则设置_termsAccepted为它.否则_termsAccepted就会NO.

因此,为了减少圈复杂度,请删除if语句.他们什么都没有.

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

使用-[NSUserDefaults registerDefaults:]建立您的备用值.这些一旦保存就会保存在内存中,但不会写入商店.然后,用户默认自己将处理所有类型的对象的"如果没有存储值,则使用此值"的情况.

  • 我可能读了这个问题.我的错.编辑时,请尝试使用` - [NSUserDefaults registerDefaults:]`来设置NSUserDefaults在未找到值时应返回的值.它们永远不会覆盖实际存储的信息,而且它们本身也不会写入商店.这只是内存中的后备. (2认同)