3

我有一些代码,我将在其中接收未知类型的对象。它可以是一个NSString, , 一个包含在 a或其他类NSNumber中的标量: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 因为实例是具体的子类型。

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

4

2 回答 2

3

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

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 标量(数字)类型的值。它定义了一组方法,专门用于将值设置和访问为有符号或无符号 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 对象。

于 2016-09-13T14:19:51.920 回答
1

关于什么:

-(void) doSomethingWith:(id) value {
    if ([value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) {
       // NSValue but not instance of NSNumber
    } else {
       ...
    }
}
于 2016-09-13T13:34:23.467 回答