我有一些代码,我将收到一个未知类型的对象。它可以是NSString
,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,因为实例是具体的子类型。
任何人都知道如何做到这一点?
答案 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
返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。
如果接收者是aClass的实例或从aClass继承的任何类的实例,则为YES,否则为NO。
返回一个布尔值,指示接收者是否是给定类的实例。
如果接收者是aClass的实例,则为YES,否则为NO。
然后非常重要
NSValue对象是单个C或Objective-C数据项的简单容器。它可以包含任何标量类型,例如int,float和char,以及指针,结构和对象id引用。使用此类可以处理集合(例如NSArray和NSSet)中的此类数据类型,键值编码以及需要Objective-C对象的其他API。 NSValue对象总是不可变的。
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对象。