Comment obtenir BOOL à partir de id
Je vais appeler valueForKey sur un objet. Il renvoie un id qui j'ai essayé de le jeter à un BOOL (parce que je sais que la valeur est un BOOLÉEN). Mais XCode donne l'avertissement suivant:
"avertissement: distribution de pointeur d'entier de taille différente..."
Donc ce que j'ai fait c'était ça:
BOOL value = [[NSNumber numberWithInt:((NSInteger)[managedObject valueForKey:@"fieldName"])] boolValue];
Je pense qu'il doit y avoir un moyen plus facile. Qui est là?
source d'informationauteur Justin Kredible
Vous devez vous connecter pour publier un commentaire.
-valueForKey: renvoie toujours à un objet.
id
est de l'objective-c type de pointeur à un objet.Vous pouvez examiner l'objet dans le débogueur. Quelques commandes utiles:
Vous trouverez que la valeur est en fait un NSNumber, de sorte que vous pouvez l'envoyer à la
-boolValue
message pour obtenir le BOOL drapeau qui vous intéresse.Si la valeur de la clé est un BOOL, l'objet retourné sera un NSNumber. Vous pouvez simplement lui demander ses
boolValue
. Vous ne pouvez pas tout simplement jeté à partir d'un objet (id
) à un BOOLÉEN ou un entier ou de toute autre non-type d'objet. Le KVC machines autoboxes scalaires dans le type de la valeur, de sorte que vous pouvez simplement lui demander pour le type que vous voulez. Vous pourriez être intéressé par le KVC docs — ils expliquer cela plus en détail.Plus facile? Peut-être pas. Plus laconique? Pas quand vous avez demandé, mais en moderne (depuis au moins 2015) Obj-C, oui. Si votre objet est un dictionnaire avec de la ficelle ou le nombre de valeurs (
NSDictionary<id, StringOrNumber>
) de toute sorte, vous pouvez utiliser:Noter que, aussi, si vous savez la valeur que vous obtenez à partir de
@"fieldName"
est unNSNumber
vous pouvez simplement sauter à la conversion:Pourquoi?
Grâce à quelques changements dans le compilateur LLVM:
NSDictionary
s peuvent maintenant être lus et écrits à l'aide du familierdictionary[key]
syntaxeNSNumber
s à l'aide de la@(value)
de la syntaxe. plusobject.property
etobject.method
.Il y a beaucoup de beau sucre syntaxique, maintenant. Je vous recommande de le regarder!
Swift 3