Objective C 布尔数组

Posted

技术标签:

【中文标题】Objective C 布尔数组【英文标题】:Objective C Boolean Array 【发布时间】:2010-10-12 07:35:57 【问题描述】:

我需要在objective-c 中使用一个布尔数组。我已经基本设置好了,但是编译器会在以下语句中抛出警告:

[updated_users replaceObjectAtIndex:index withObject:YES];

这是,我敢肯定,因为 YES 根本就不是一个对象;这是一个原始的。无论如何,我需要这样做,并且非常感谢有关如何完成它的建议。

谢谢。

【问题讨论】:

当询问警告时,请发布有问题的警告:) 【参考方案1】:

没错,就是这样: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];

【讨论】:

【参考方案2】:

假设您的数组包含有效对象(并且不是 c 样式数组):

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

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

【讨论】:

我很想知道为什么尼克斯的回答比这个得到了更多的支持,因为这看起来更优雅。谁能解释一下区别?【参考方案3】:

您可以存储NSNumbers:

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

或使用 C 数组,具体取决于您的需要:

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

【讨论】:

【参考方案4】:

就像 Georg 所说,使用 C 数组。

BOOL myArray[10];

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


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

Martijn,“myArray”是您使用的名称,在georg 的示例中为“array”。

【讨论】:

【参考方案5】:

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

[updated_users replaceObjectAtIndex:index withObject:@YES];

其中@YES 等同于[NSNumber numberWithBool:YES]

【讨论】:

【参考方案6】:

如果您的集合很大或者您希望它比 objc 对象更快,请尝试 CoreFoundation 中的 CFBitVector/CFMutableBitVector 类型。它是 CF-Collections 类型之一,与 NS 对应,但如果需要,它可以快速包装在 objc 类中。

【讨论】:

以上是关于Objective C 布尔数组的主要内容,如果未能解决你的问题,请参考以下文章

布尔包装?制作一个 `BOOL` 值的对象。 (目标-C)

objective-c数组

Objective C:成员变量和数组

Objective - C NSArray不可变数组和NSMutableArray可变数组

Objective C二维数组内存问题

关于objective-c数组,这些方法你得知道