【问题标题】:Is there a better way to write this call to numerous NSUserDefault BOOLS?有没有更好的方法来编写这个对众多 NSUserDefault BOOLS 的调用?
【发布时间】:2014-10-22 04:55:41
【问题描述】:

我正在努力优化我的代码并改进我的编程。我正在查看这个不断更新的声明。

有没有更好的方法来纠正对众多 BOOLS 的调用?是否可以将它们包含在FOR 语句中?

baseballHat = [[NSUserDefaults standardUserDefaults] boolForKey:
 @"baseballHat"];

 asianHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"asianHat"];

    cowboyHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"cowboyHat"];

    topHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"topHat"];

    partyHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"partyHat"];

    sumbreroHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"sumbreroHat"];

     wizardHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"wizardHat"];

     beretHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"beretHat"];

    pirateHat = [[NSUserDefaults standardUserDefaults] boolForKey: @"pirateHat"];

     vikingHelmet = [[NSUserDefaults standardUserDefaults] boolForKey: @"vikingHelmet"];


     if(baseballHat == YES){

         _baseballWearBut.visible = YES;
        _baseballHatOwned.visible = YES;

    }
      if(topHat == YES){

         //Continue with if statements

【问题讨论】:

    标签: ios boolean nsuserdefaults


    【解决方案1】:
    // *** Following is few snippets ***
    
    // *** Create a Dictionary with various states ***
    NSMutableDictionary *dictStates = [[NSMutableDictionary alloc] init];
    [dictStates setObject:[NSNumber numberWithBool:YES] forKey:@"asianHat"];
    [dictStates setObject:[NSNumber numberWithBool:NO] forKey:@"cowboyHat"];
    [dictStates setObject:[NSNumber numberWithBool:NO] forKey:@"topHat"];
    
    // *** Save them to UserDefaults ***
    [[NSUserDefaults standardUserDefaults] setObject:dictStates forKey:@"MyStates"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    // *** Again Access all the various states stored in UserDefaults ***
    NSMutableDictionary *dict = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyStates"];
    
    // *** Iterate through all the Objects ***
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@ is %@",key , obj);
    }];
    
    // *** Modify Existing value and store again to UserDefaults ***
    // *** Create Mutable Copy of Dictionary ***
    NSMutableDictionary *dictModified = [[[NSUserDefaults standardUserDefaults] objectForKey:@"MyStates"] mutableCopy];
    // *** modify value ***
    [dictModified setObject:[NSNumber numberWithBool:YES] forKey:@"topHat"];
    // *** Save them to UserDefaults ***
    [[NSUserDefaults standardUserDefaults] setObject:dictModified forKey:@"MyStates"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    【讨论】:

      【解决方案2】:

      这应该可以解决问题:

      NSArray *array = @[@"baseball", @"asian", @"cowboy", @"top"]; //and the other ones
      for (NSString *prefixKey in array) 
      {
          NSString *key = [NSString stringWithFormat:@"%@Hat", prefixKey];
          BOOL boolValue = [[NSUserDefaults standardUserDefaults] boolForKey:key];
          [self setValue:@(boolValue) forKey:key]; 
      }
      

      我不推荐,我不喜欢用“他们的名字”(使用valueForKey:)来调用变量。

      另一种方法是使用NSDictionaryNSArray,但随后,您需要将BOOL 封装到对象中(例如NSNumber),并且可以添加另一个级别。
      您可能需要重新考虑您的架构应用程序。
      Hat 只是 BOOL 吗?它有更多信息吗?它可能只是一个不同对象的 var(例如,使用 var hat 创建一个类)?
      你可以给TRUE 提供各种这样的帽子值吗?如果没有,也许使用enumdef 可能是一个很好的解决方案。

      【讨论】:

        猜你喜欢
        • 2013-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 2012-04-28
        • 1970-01-01
        相关资源
        最近更新 更多