【问题标题】:looping array and saving objects in NSMutableDictionary does not work?? logical problem?在 NSMutableDictionary 中循环数组和保存对象不起作用?逻辑问题?
【发布时间】:2010-11-28 22:49:52
【问题描述】:

看来我在这个循环中有一个逻辑问题。我正在尝试:

  • 循环 myKeys(来自 dict)以查找选定的玩家
  • 为 NSMutableArray (thePlayers) 中的选定玩家设置三个 BOOL 参数(YES 或 NO)
  • 使用 'thePlayers' 和 'myKeys' 更新 dict (selectedPlayerDict)
  • 清空 thePlayers 并执行新的循环和相同的操作

单个玩家,当我分别选择每个玩家时,有以下参数:

selectedPlayerDict:{Hannah = (0,0,1);}

selectedPlayerDict: { AAAXXX = ( 1、 1、 1 ); }

当同时选择两者时,意味着触发 (if ([theObjects objectAtIndex:3] == [NSNumber numberWithBool:YES])),我得到以下结果

selectedPlayerDict: { AAAXXX = ( 0, 0, 1、 1、 1、 1 ); 汉娜 = ( 0, 0, 1、 1、 1、 1 ); }

对于上面的结果,我使用:

//[玩家移除所有对象]; //

当我更改并删除评论“//”时:

[玩家移除所有对象]; //

我得到以下结果:

selectedPlayerDict: { AAAXXX = ( ); 汉娜 = ( ); }

我使用的代码是:

for (NSString *myKeys in allTheKeys) {
    theObjects = [playerDict valueForKey:myKeys];

    if ([theObjects objectAtIndex:3] == [NSNumber numberWithBool:YES]) {

        //[thePlayers addObject:myKeys]; 

        NSLog(@"Spelare: %@ är vald", myKeys);
        NSLog(@">>>><<<<");

        // Check what difficulties level
        if ([theObjects objectAtIndex:0] == [NSNumber numberWithBool:YES]) { //hard
            NSLog(@"Player have diff HARD");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff HARD");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        if ([theObjects objectAtIndex:1] == [NSNumber numberWithBool:YES]) { //medium
            NSLog(@"Player have diff MEDIUM");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff MEDIUM");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        if ([theObjects objectAtIndex:2] == [NSNumber numberWithBool:YES]) { //easy
            NSLog(@"Player have diff EASY");
            [thePlayers addObject:[NSNumber numberWithBool:YES]]; //@"YES"];
        }
        else {
            NSLog(@"Player have NOT diff EASY");
            [thePlayers addObject:[NSNumber numberWithBool:NO]]; //@"NO"];
        }
        [selectedPlayerDict setValue:thePlayers forKey:myKeys];
        [thePlayers removeAllObjects];   //<<<<<<<<<<<<<<<<<<<<<<<<<<
    }

}
NSLog(@"selectedPlayerDict: %@", selectedPlayerDict);

我知道我可能在逻辑上做错了,但我已经尝试了几个小时来试图理解我做错了什么。我不明白为什么 dic 的对象是空的,因为我在更新 dict 后循环末尾的数组中是“removeAllObjects”?我试过“setObject:forKey:”但没有运气。

【问题讨论】:

    标签: iphone objective-c nsmutabledictionary


    【解决方案1】:

    问题是您为 selectedPlayerDict 中的每个键重复使用相同的数组。您需要为每个循环迭代创建一个新数组;否则,removeAllObjects 将从单个数组中删除所有对象,该数组是字典中每个键的值。

    作为旁注,我想知道 enum {Easy, Medium, Hard}; 是否比 3 个 BOOLs 更能满足您的需求——如果用户选择 > 1 个选项会发生什么?

    【讨论】:

    • 我从 enum 开始,但当我试图解决问题时,我一直在测试各种东西,最终得到了现在的结果。会改变的。
    【解决方案2】:

    其他答案已经找到了您的问题根源,但这里有一个潜在的其他问题:

    [theObjects objectAtIndex:2] == [NSNumber numberWithBool:YES]
    

    这似乎可行,因为[NSNumber numberWithBool:YES] 可能缓存在某处,但请记住== 比较对象身份,而不是对象相等性。如果你知道theObjects数组中的对象是NSNumber对象,你可以使用boolValue

    if ([[theObjects objectAtIndex:2] boolValue])
       ...
    

    如果不确定数组中的对象是否为 NSNumber 实例,可以使用如下:

    if ([[theObjects objectAtIndex:2] isEqual:[NSNumber numberWithBool:YES]])
       ...
    

    【讨论】:

      【解决方案3】:

      您正在清除刚刚添加到字典中的数组。

      试试这个:

      NSArray* tempArray = [thePlayers copy];
      [selectedPlayerDict setValue:tempArray forKey:myKeys];   
      [tempArray release];
      

      【讨论】:

        猜你喜欢
        • 2018-11-13
        • 1970-01-01
        • 2014-08-15
        • 2012-02-24
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        相关资源
        最近更新 更多