web-dev-qa-db-fra.com

Dictionnaire Objective-C insérant un BOOL

OK, je suis un peu confus. C'est probablement juste une banalité.

J'ai une fonction qui ressemble à ceci:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails {
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setValue:news  forKey:@"getNews"];
[parameters setValue:mails forKey:@"getMails"];...}

Peu importe que j'utilise setValue:forKey: ou setObject:ForKey:, Je reçois toujours un avertissement:

"Passer l'argument 1 de l'ensemble ... crée un pointeur à partir d'un entier sans transtypage" ...

Comment diable puis-je insérer un bool dans un dictionnaire?

62
Infinite

Les valeurs dans un NSDictionary doivent être des objets. Pour résoudre ce problème, enveloppez les booléens dans des objets NSNumber:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"];
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"];
124
Steve Harrison

Les conteneurs Objective-C ne peuvent stocker que des objets Objective-C, vous devez donc envelopper votre BOOL dans un objet. Vous pouvez créer un objet NSNumber avec [NSNumber numberWithBool] Et stocker le résultat.
Plus tard, vous pouvez récupérer votre valeur booléenne en utilisant -boolValue De NSNumber.

14
Vladimir

Un BOOL n'est pas un objet - c'est un synonyme d'un int et a 0 ou 1 comme valeurs. Par conséquent, il ne sera pas placé dans une structure contenant des objets.

Vous pouvez utiliser NSNumber pour créer un wrapper d'objet pour n'importe quel type d'entier; il y a un constructeur [NSNumber numberWithBool:] que vous pouvez invoquer pour obtenir un objet, puis l'utiliser. De même, vous pouvez l'utiliser pour récupérer l'objet à nouveau: [obj boolValue].

8
AlBlue

Code de référence moderne:

parameters[@"getNews"] = @(news);
8
Hatchmaster J

Vous pouvez insérer @"YES" ou @"NO" les objets chaîne et Cocoa le lancera à bool une fois que vous les aurez relus.

Sinon, je suggère de créer un dictionnaire en utilisant la méthode d'usine comme dictionaryWithObjectsAndKeys:.

6
Eimantas

En voyant la réponse de @Steve Harrison, j'ai un commentaire. Pour une raison quelconque, cela ne fonctionne pas avec le passage de propriétés d'objet comme par exemple.

 [parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"];

Cela définit la clé news sur null dans le paramètre NSDictionary (pour une raison quelconque, je ne peux pas vraiment comprendre pourquoi)

Ma seule solution était d'utiliser la manière de @ Eimantas comme suit:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"];

Cela a fonctionné parfaitement. Ne me demandez pas pourquoi passer directement le BOOL ne fonctionne pas mais au moins j'ai trouvé une solution. Des idées?

2
pechar