将NSUInteger添加到NSMutableArray

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;
}

NSUInteger是一个“标量”,而不是一个“对象”。你只能将“对象”添加到NSArray中。但是,你可以将NSNumber添加到NSArray中,NSNumber是一个通用的数字类型“包装器”类。请参阅NSNumber的规范。 - Hot Licks
2个回答

11

NSArray(以及它的子类 NSMutableArray)仅支持对象,您无法向其中添加原生值。

请查看-addObject:的签名。

- (void)addObject:(id)anObject

正如您所看到的,它期望将id作为参数,这大致意味着任何对象

因此,您必须按以下方式将整数包装在NSNumber实例中:

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

其中@(index)语法糖[NSNumber numberWithInt:index]

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

NSUInteger index = [self.flipCardIndexes[0] integerValue]; // 0 as example

1
鉴于用户的经验,解释如何从数组中获取NSUInteger可能会有所帮助。 - rmaddy

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宏定义为int和long。

要将其添加到数组中,您需要先将其转换为对象。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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接