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"];
Il veut un objet réel ... utilisez NSNull
[NSNull null];
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 estnil
, auquel cas la méthode tente de supprimer la clé à l'aide deremoveObjectForKey:
.
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é.
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"];
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.
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