web-dev-qa-db-ja.com

Objective Cブール配列

私はobjective-cでブールの配列を利用する必要があります。ほとんど設定されていますが、コンパイラは次のステートメントで警告をスローします。

[updated_users replaceObjectAtIndex:index withObject:YES];

YESは単にオブジェクトではないので、これは確かです。それはプリミティブです。とにかく、私はこれを行う必要があり、それを達成する方法についてのアドバイスをいただければ幸いです。

ありがとう。

38
Allyn

はい、それはまさにそのとおりです。NS*コンテナは、プリミティブ型ではなく、目的Cのオブジェクトのみを格納できます。

あなたはそれをNSNumberでラップすることによってあなたが望むものを達成することができるはずです:

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

または、BOOLNSNumberでラップする@(YES)を使用する

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

次に、boolValueを引き出します。

_BOOL mine = [[updated_users objectAtIndex:index] boolValue];_

72
Nick Partridge

配列に有効なオブジェクトが含まれていると仮定します(Cスタイルの配列ではありません)。

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

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

NSNumbersを保存できます:

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

または、必要に応じてC配列を使用します。

BOOL array[100];
array[31] = YES;
11
Georg Schölly

Georgが言ったように、C配列を使用します。

BOOL myArray[10];

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

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

Martijn、「myArray」は使用する名前、georgの例では「array」です。

8
Nicki

XCode 4.4以降では、Objective-Cリテラルを使用できます。

[updated_users replaceObjectAtIndex:index withObject:@YES];

ここで、@YES[NSNumber numberWithBool:YES]と同等です

4
Ivan Marinov

コレクションが大きい場合、またはobjcオブジェクトよりも高速にしたい場合は、CoreFoundationにあるCFBitVector/CFMutableBitVectorタイプを試してください。 notがNS対応するものと一緒に出荷されるCF-Collectionsタイプの1つですが、必要に応じてobjcクラスにすばやくラップできます。

1
justin