Objective c 如何在从NSUserDefault初始化时降低高圈复杂度

Objective c 如何在从NSUserDefault初始化时降低高圈复杂度,objective-c,optimization,static-analysis,lint,oclint,Objective C,Optimization,Static Analysis,Lint,Oclint,我有一个对象的初始值设定项: -(id)init { self = [super init]; if (self) { if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){ _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted]

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

-(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
s被初始化为
NO
。因此:

if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
    _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
。。。is:如果存在存储值,则将
\u termsAccepted
设置为该值。否则接受的术语将是否

boolforky:
有一个记录在案的返回值:

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

因此,请与以下内容进行比较和对比:

_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
。。。在这种情况下,最终结果将是:如果存在存储值,则将
\u termsAccepted
设置为该值。否则接受的术语将是否

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

编辑:有人正确地指出,我忽略了一个事实,
BOOL
s并不是专门使用的


使用
-[NSUserDefaults registerDefaults:
建立回退值。这些设置一经设置就保存在内存中,但不会写入存储。然后,默认情况下,用户自己将为所有类型的对象处理“如果没有存储值,请使用此值”的情况。

好的,可能我的问题不清楚。也许是这样。但如果它说“/50其他if语句”,那么也有其他类型的变量,而不仅仅是bool。我有NSStrings、NSMutableArray、NSDate等。直接赋值是否适用于任何类型?我实际上添加了一种情况,在这种情况下,我希望使用默认值初始化,以防NSUserDefaults不存在……我可能没有读到这个问题。是我的错。编辑后,请尝试使用
-[NSUserDefaults registerDefaults:
设置未找到值时NSUserDefaults应返回的值。它们从不覆盖实际存储的信息,它们自己也从不写入存储。这只是一个记忆中的退步。太棒了,汤米,谢谢你。我会尝试一下,稍后再回来,如果一切正常(我认为应该如此!),我会选择接受。感谢您再次推荐使用
注册表默认结果:
。我在回答中举例说明: