web-dev-qa-db-fra.com

iOS: pourquoi ne puis-je pas définir nil sur la valeur NSDictionary?

Cela pourrait être une question très basique, mais je me demandais pourquoi je ne peux pas attribuer nil comme valeur NSDictionary? J'ai la déclaration suivante à plusieurs endroits dans mon code. Si [q objectForKey:@"text"] est nul alors l'application se bloque.

NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict setObject:[q objectForKey:@"text"] forKey:@"text"];

Je dois vérifier partout le zéro avant de l'attribuer au dictionnaire. Est-ce la seule manière correcte de procéder? Suis-je en train de manquer quelque chose d'évident?

if([q objectForKey:@"text"] != nil)
    [dict setObject:[q objectForKey:@"text"] forKey:@"text"];
else
    [dict setObject:@"" forKey:@"text"];
43
applefreak

Il veut un objet réel ... utilisez NSNull

[NSNull null];
64
tybro0103

Vous pouvez définissez une valeur nulle en utilisant setValue:forKey mais il supprime la clé.

Si vous souhaitez pouvoir définir une clé sur nil, vous pouvez utiliser setValue:forKey: qui supprimera la clé si vous la définissez sur nil (citation de la documentation ci-dessous). Notez la valeur au lieu de l'objet.

setValue:forKey:

Ajoute une paire clé-valeur donnée au dictionnaire.

...
Discussion

Cette méthode ajoute de la valeur et de la clé au dictionnaire à l'aide de setObject:forKey:, sauf si la valeur est nil, auquel cas la méthode tente de supprimer la clé à l'aide de removeObjectForKey:.

Lorsque vous essayez ultérieurement d'obtenir l'objet à l'aide de objectForKey: pour la clé que vous avez supprimée en la définissant sur nil vous obtiendrez nil en retour (citation de la documentation ci-dessous).

Valeur de retour:

La valeur associée à aKey, ou nil si aucune valeur n'est associée à aKey.

Remarque: La clé ne sera pas réellement présente dans le dictionnaire, elle ne sera donc pas obtenue en utilisant allKeys; ou être énuméré.

49
David Rönnqvist

Vous pouvez définir un objet nil de cette manière:

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

dictionary[@“key”] = nil;

L'avez-vous remarqué?

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

/* this statement is safe to execute    */

dictionary[@“key”] = nil;

/* but this statement will crash application    */

[dictionary setObject:nil forKey:@"key"];
4
SamSol

Lorsque vous utilisez cette méthode:

func setObject(_ anObject: Any, forKey aKey: NSCopying)

Paramètres ( selon Apple doc's ):

anObject:

Déclenche une exception invalidArgumentException si anObject est nul. Si vous devez représenter une valeur nulle dans le dictionnaire, utilisez NSNull.

aKey

Déclenche une exception invalidArgumentException si aKey vaut nil.

1
Avi Levin

Mon ami utilisant nil comme marqueur est un signe de mauvaise programmation. nil est réservé à des fins différentes.

 if ([q objectForKey: @ "text"]! = nil) 
 [dict setObject: [q objectForKey: @ "text"] forKey: @ "text"]; 
 else 
 [dict removeObjectforKey: @ "text"]; // cela ne fera rien si la clé n'existe pas. 

// par défaut pour toutes les clés, la valeur est nulle et vous essayez de remplacer ce comportement. aller à l'encontre des règles linguistiques vous causera toujours des ennuis.

pour vérifier il suffit d'utiliser

 if ([dict objectforKey: @ "text"]! = nil) {} // cela fonctionnera car la valeur par défaut est nil 
 lui-même 
0
Kunal Balani