3

您好我正在做一个项目,我正在尝试将 NSUInteger 添加到 NSMutableArray。我一般是 Objective-C 和 C 的新手。当我运行应用程序 NSLog 显示为空。

我将不胜感激任何人能够提供的任何帮助。

这是我的代码

-(NSMutableArray *)flipCardAtIndex:(NSUInteger)index
{
    Card *card = [self cardAtIndex:index];
    [self.flipCardIndexes addObject:index];

    if(!card.isUnplayable)
    {
        if(!card.isFaceUp)
        {
            for(Card *otherCard in self.cards)
            {
                if(otherCard.isFaceUp && !otherCard.isUnplayable)
                {
                    int matchScore = [card match:@[otherCard]];
                    if(matchScore)
                    {
                        otherCard.unplayable = YES;
                        card.unplayable = YES;
                        self.score += matchScore * MATCH_BONUS;
                    }
                    else 
                    {
                        otherCard.faceUp = NO;
                        self.score -=MISMATCH_PENALTY;
                    }
                    break;
                }
            }
            self.score -=FLIP_COST;
        }
        card.faceUp = !card.isFaceUp;
    }
    NSLog(@"%@",self.flipCardIndexes[self.flipCardIndexes.count-1]);
    return self.flipCardIndexes;
}
4

2 回答 2

11

NSArray(连同它的子类NSMutableArray)只支持对象,你不能给它添加原生值。

检查签名-addObject:

- (void)addObject:(id)anObject

如您所见,它期望id作为参数,大致表示任何 object

因此,您必须将整数包装在一个NSNumber实例中,如下所示

[self.flipCardIndexes addObject:@(index)];

@(index)语法糖在哪里[NSNumber numberWithInt:index]

然后,为了在NSUInteger从数组中提取它时将其转换回,您必须按如下方式“解包”它

NSUInteger index = [self.flipCardIndexes[0] integerValue]; // 0 as example
于 2013-08-24T19:03:41.233 回答
2

您只能将对象添加到 NSMutableArrays。addObject 接受 id 类型的对象,这意味着它将接受一个对象。

然而,NSIntegers 和 NSUIntegers 不是对象。它们只是被定义为 C 风格的变量。

#if __LP64__ || NS_BUILD_32_LIKE_64
    typedef long NSInteger;
    typedef unsigned long NSUInteger;
#else
    typedef int NSInteger;
    typedef unsigned int NSUInteger;
#endif

如您所见,它们只是基于 typedef 宏定义为整数和长整数。

要将其添加到您的数组中,您需要先将其转换为对象。NSNumber 是Objective C 类,它允许您存储任何类型的数字。要制作 NSNumber,您需要使用 numberWithInt 方法,将变量作为参数传递。

NSNumber *number = [NSNumber numberWithInt:card];

现在您的变量已包装在一个对象中,您可以将其添加到数组中。

[self.flipCardIndexes addObject:number];

最后,如果您想在将来检索该元素,则必须删除该对象,然后将其转换回您可以使用的 int 值。称呼

NSNumber *number = [self.flipCardIndexes objectAtIndex:index];

其中 index 是您尝试检索的卡片的索引。接下来,您必须通过调用 integerValue 将此值转换为整数。

NSUInteger *value = [number integerValue];
于 2013-08-24T19:02:47.193 回答