Objective C 布尔数组

40

我需要在Objective-C中使用布尔值数组。我已经基本设置好了,但编译器在以下语句处抛出警告:

[updated_users replaceObjectAtIndex:index withObject:YES];

我相信,这是因为YES只是一个基本类型,而不是对象。无论如何,我需要做到这一点,并且非常感谢关于如何实现它的建议。

谢谢。


3
如果询问警告,请发布相关的警告内容 :) - Andrew Grant
6个回答

73

没错,这正是问题所在:NS* 容器只能存储 Objective-C 对象,而不能存储原始类型。

您可以通过将其包装在 NSNumber 中来实现您想要的功能:

[updated_users replaceObjectAtIndex:index withObject:[NSNumber numberWithBool:YES]]

或者使用 @(YES) 将一个 BOOL 包装在一个 NSNumber

[updated_users replaceObjectAtIndex:index withObject:@(YES)]]

然后,您可以提取出 boolValue:

BOOL mine = [[updated_users objectAtIndex:index] boolValue];


14

假设您的数组包含有效对象(并且不是C风格的数组):

#define kNSTrue         ((id) kCFBooleanTrue)
#define kNSFalse        ((id) kCFBooleanFalse)
#define NSBool(x)       ((x) ? kNSTrue : kNSFalse)

[updated_users replaceObjectAtIndex:index withObject:NSBool(YES)];

2
我很好奇为什么Nick的答案得到了比这个更多的支持,因为这个似乎更优雅。有人能解释一下区别吗? - Chris

12

你可以存储 NSNumbers

[updated_users replaceObjectAtIndex:index
                         withObject:[NSNumber numberWithBool:YES]];

或者根据您的需求使用C数组:

BOOL array[100];
array[31] = YES;

8

像Georg所说的那样,使用C数组。

BOOL myArray[10];

for (int i = 0; i < 10; i++){
  myArray[i] = NO;
}

if (myArray[2]){
   //do things;
}

马蒂因,"myArray" 是你使用的名称,而在乔治的例子中是 "array"。


5

从XCode 4.4开始,您可以使用Objective-C字面量。

[updated_users replaceObjectAtIndex:index withObject:@YES];

其中@YES相当于[NSNumber numberWithBool:YES]


1
如果你的集合很大或者你希望它比objc对象更快,可以尝试使用CoreFoundation中的CFBitVector/CFMutableBitVector类型。这是CF-Collections类型之一,它没有NS对应的类型,但如果需要的话,可以快速地封装成一个objc类。

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