【问题标题】:ObjC: differentiating between NSValue and NSNumberObjC:区分 NSValue 和 NSNumber
【发布时间】:2016-09-13 13:26:45
【问题描述】:

我有一些代码将接收未知类型的对象。它可以是 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]] ... 无法识别 NSValue,因为实例是具体的子类型。

有人知道怎么做吗?

【问题讨论】:

    标签: ios nsnumber nsvalue


    【解决方案1】:

    首先我们需要了解 iskindofClass 和 isMemberOfClass 之间的区别

    isKindOfClass

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

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

    isMemberOfClass

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

    如果接收者是一个类的实例,则为是,否则为否。

    那么非常重要

    NSValue

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

    NSNumber

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

    【讨论】:

      【解决方案2】:

      怎么样:

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

      【讨论】:

      • 谢谢。我最终也得到了这个解决方案。 :-) 有点难看但有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多