iphone - 循环数组并在 NSMutableDictionary 中保存对象不起作用?逻辑问题?

标签 iphone objective-c nsmutabledictionary

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

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

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

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 ); Hannah = ( 0, 0, 1, 1, 1, 1 ); }

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

//[thePlayers removeAllObjects]; //<<<<<<<<<<<<<<<<<<<<<<<<<<

当我更改并删除注释“//”时:

[thePlayers removeAllObjects]; //<<<<<<<<<<<<<<<<<<<<<<<<<<

我得到以下结果:

selectedPlayerDict: { AAAXXX = ( ); Hannah = ( ); }

我使用的代码是:

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 的对象是空的,因为我在更新字典后在循环末尾的数组中“removeAllObjects”?我尝试过“setObject:forKey:”,但没有成功。

最佳答案

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

作为旁注,我想知道 enum {Easy, Medium, Hard}; 是否可以比 3 BOOL 更好地满足您的需求 - 如果用户选择了 > 1 个选项?

关于iphone - 循环数组并在 NSMutableDictionary 中保存对象不起作用?逻辑问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299591/

相关文章:

ios - 尝试更改导航栏背景颜色但失败

iphone - CGAffineTransformMakeRotation不仅可以旋转,还可以移动和拉伸(stretch)UIImageView

ios - 基于图像的核心数据模型关系是否正确?

ios - NSMutable 字典,我是每次使用它时都初始化还是将它保存并加载到文件中?

ios - 字典键排序选项-按字母顺序然后按数字

c++ - NSMutableDictionary 和 std::map 的访问运算符之间的区别

ios - performBatchUpdates 崩溃的噩梦

iphone - Actionscript 3.0 剪切和粘贴或删除对象

ios - Swift 转换后的 Objective-C 方法签名相同

ios - 当某些键动态更改时如何从字典中获取值