将 NSUInteger 添加到 NSMutableArray
Posted
技术标签:
【中文标题】将 NSUInteger 添加到 NSMutableArray【英文标题】:Add NSUInteger to NSMutableArray 【发布时间】:2013-08-24 18:58:57 【问题描述】:您好,我正在做一个项目,我正在尝试。我一般是 Objective-C 和 C 的新手。当我运行应用程序时,NSLog 显示为 null。
如果有人能够提供任何帮助,我将不胜感激。
这是我的代码
-(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 的规范。 【参考方案1】:NSArray
(连同它的子类NSMutableArray
)只支持对象,你不能给它添加原生值。
查看-addObject:
的签名
- (void)addObject:(id)anObject
如您所见,它期望 id
作为参数,大致表示任何对象。
因此,您必须将整数包装在 NSNumber
实例中,如下所示
[self.flipCardIndexes addObject:@(index)];
其中@(index)
是syntactic sugar 对应[NSNumber numberWithInt:index]
。
然后,为了在从数组中提取它时将其转换回NSUInteger
,您必须按如下方式“解包”它
NSUInteger index = [self.flipCardIndexes[0] integerValue]; // 0 as example
【讨论】:
考虑到用户的体验,解释一下如何从数组中取回NSUInteger
可能会有所帮助。【参考方案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];
【讨论】:
以上是关于将 NSUInteger 添加到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章