web-dev-qa-db-fra.com

Tableau booléen Objective C

J'ai besoin d'utiliser un tableau de booléens dans objective-c. Je l'ai principalement installé, mais le compilateur envoie un avertissement à l'instruction suivante:

[updated_users replaceObjectAtIndex:index withObject:YES];

C'est, j'en suis sûr, parce que OUI n'est tout simplement pas un objet; c'est une primitive. Quoi qu'il en soit, je dois le faire et j'apprécierais grandement les conseils pour y parvenir.

Merci.

38
Allyn

Oui, c'est exactement ce que c'est: les conteneurs NS * ne peuvent stocker que des objets objective-C, pas des types primitifs.

Vous devriez pouvoir accomplir ce que vous voulez en l'enveloppant dans un NSNumber:

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

ou en utilisant @(YES) qui enveloppe un BOOL dans un NSNumber

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

Vous pouvez ensuite retirer la valeur boolValue:

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

72
Nick Partridge

En supposant que votre tableau contient des objets valides (et n'est pas un tableau de style 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

Vous pouvez soit stocker NSNumbers:

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

ou utilisez un tableau C, selon vos besoins:

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

Comme Georg l'a dit, utilisez un tableau C.

BOOL myArray[10];

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

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

Martijn, "myArray" est le nom que vous utilisez, "array" dans l'exemple de georg.

8
Nicki

À partir de XCode 4.4, vous pouvez utiliser des littéraux Objective-C.

[updated_users replaceObjectAtIndex:index withObject:@YES];

@YES est équivalent à [NSNumber numberWithBool:YES]

4
Ivan Marinov

Si votre collection est volumineuse ou si vous souhaitez qu'elle soit plus rapide que les objets objc, essayez les types CFBitVector/CFMutableBitVector trouvés dans CoreFoundation. C'est l'un des types CF-Collections qui pas est livré avec un équivalent NS, mais il peut être rapidement inclus dans une classe objc, si vous le souhaitez).

1
justin