2016-09-13 1 views
1

J'ai un code où je recevrai un objet de type inconnu. Il pourrait être un NSString, NSNumber, un scalaire enveloppé dans un NSValue ou d'une autre classe:ObjC: différencier NSValue et NSNumber

-(void) doSomethingWith:(id) value { 
    if (<test-for-NSValue>) { 
     // Do something with a NSValue 
    } else { 
     // Do something else 
    } 
} 

Je dois identifier où il y a un type scalaire dans un NSValue.

Le problème consiste à identifier un scalaire enveloppé NSValue par rapport à un NSNumber. Comme NSNumber hérite de NSValue et que les deux sont des clusters de classe, j'ai du mal à les trier.

Alors:

[value isKindOfClass:[NSValue class]] ... voit NSNumbers comme NSValues.

[value isMemberOfClass:[NSValue class]] ... ne reconnaît pas NSValues ​​car les instances sont des sous-types concrets.

Quelqu'un a eu une idée de comment faire cela?

Répondre

1

Qu'en est-:

-(void) doSomethingWith:(id) value { 
    if ([value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) { 
     // NSValue but not instance of NSNumber 
    } else { 
     ... 
    } 
} 
+0

Merci. J'ai fini avec cette solution aussi. :-) Un peu moche mais ça marche. – drekka

1

d'abord nous avons besoin de la diffrenciation entre isKindOfClass et isMemberOfClass

isKindOfClass

Renvoie une valeur booléenne indiquant si le récepteur est une instance de classe donnée ou une instance de n'importe quelle classe qui hérite de cette classe. OUI si le destinataire est une instance de aClass ou une instance de toute classe qui hérite de aClass, sinon NO.

isMemberOfClass

Renvoie une valeur booléenne indiquant si le récepteur est une instance d'une classe donnée. OUI si le destinataire est une instance de aClass, sinon NO.

alors très important

NSValue

Un objet NSValue est un simple conteneur pour un seul C ou Objective-C donnée. Il peut contenir l'un des types scalaires tels que int, float et char, ainsi que des pointeurs, des structures et des références d'objets. Utilisez cette classe pour travailler avec de tels types de données dans des collections (telles que NSArray et NSSet), le codage de valeurs-clés et d'autres API nécessitant des objets Objective-C. Les objets NSValue sont toujours immuables.

NSNumber

NSNumber est une sous-classe de NSValue qui offre une valeur quelconque scalaire C (numérique) de type.Il définit un ensemble de méthodes spécifiques pour définir et accéder à la valeur en tant que char signé ou non signé, int court, int, long int, long long int, float ou double ou en tant que BOOL. (Notez que les objets numériques ne conservent pas nécessairement le type qu'ils sont créés avec.) Il définit également une comparaison: méthode pour déterminer l'ordre de deux objets NSNumber

if ([value isKindOfClass:[NSValue class]]) //It will return YES because NSNumber value subclass or inherits from NSValue 
{ 
    .......... 
} 

if ([value isMemberOfClass:[NSValue class]]) //It will return NO because NSNumber value is not a member of the NSValue 
{ 
    ......... 
} 

objets de classe peuvent être créés par le compilateur objets mais ils soutiennent toujours le concept d'adhésion. Ainsi, vous pouvez utiliser cette méthode pour vérifier que le récepteur est un objet Class spécifique.