ObjC:区分NSValue和NSNumber

时间:2016-09-13 13:26:46

标签: ios nsnumber nsvalue

我有一些代码,我将收到一个未知类型的对象。它可以是NSStringNSNumber,包含在NSValue或其他类中的标量:

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

我需要确定NSValue中有标量类型的位置。

问题在于识别NSValue包裹的标量与NSNumber。由于NSNumber继承自NSValue并且都是类集群,所以我很难将它们整理出来。

所以:

[value isKindOfClass:[NSValue class]] ...将NSNumbers视为NSValues。

[value isMemberOfClass:[NSValue class]] ...无法识别NSValues,因为实例是具体的子类型。

任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

怎么样:

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

答案 1 :(得分:1)

首先我们需要iskindofClass和isMemberOfClass之间的diffrenciation

isKindOfClass

  

返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。

     

如果接收者是aClass的实例或从aClass继承的任何类的实例,则为YES,否则为NO。

isMemberOfClass

  

返回一个布尔值,指示接收者是否是给定类的实例。

     

如果接收者是aClass的实例,则为YES,否则为NO。

然后非常重要

NSValue

  

NSValue对象是单个C或Objective-C数据项的简单容器。它可以包含任何标量类型,例如int,float和char,以及指针,结构和对象id引用。使用此类可以处理集合(例如NSArray和NSSet)中的此类数据类型,键值编码以及需要Objective-C对象的其他API。 NSValue对象总是不可变的。

NSNumber

  

NSNumber是NSValue的子类,它提供任何C标量(数字)类型的值。它定义了一组专门用于设置和访问值的方法,如有符号或无符号字符,short int,int,long int,long long int,float或double或BOOL。 (注意,数字对象不一定保留它们创建的类型。)它还定义了一个compare:方法来确定两个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
{
   ......... 
}
  

类对象可以是编译器创建的对象,但它们仍然支持成员资格的概念。因此,您可以使用此方法来验证接收器是否是特定的Class对象。

相关问题