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

How to reduce high cyclomatic complexity while initializing from NSUserDefaults

我有一个对象的初始值设定项:

-(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 分析时就不会收到这些警告?

谢谢!

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

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

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

boolForKey: 记录的 return 值为:

If a boolean value is associated with defaultName in the user defaults, that value is returned. Otherwise, NO is returned.

所以比较和对比只是:

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

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

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

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

使用 -[NSUserDefaults registerDefaults:] 建立您的后备值。这些一旦设置就保存在内存中,但不会写入商店。然后用户默认自己将处理所有类型对象的 "if no value stored, use this value" 情况。