我有一个对象的初始值设定项:
-(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:
有记录的返回值:
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:]
来建立你的后备值。这些一旦设置就保存在内存中,但不会写入商店。然后用户默认自己将为所有类型的对象处理“如果没有存储值,则使用此值”的情况。
关于objective-c - 如何在从 NSUserDefaults 初始化时降低高圈复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043436/