我有一些代码,在那里我将接收一个未知类型的对象。它可以是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,因为实例是具体的子类型。
有人知道怎么做吗?
发布于 2016-09-13 13:34:23
那麽:
-(void) doSomethingWith:(id) value {
if ([value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) {
// NSValue but not instance of NSNumber
} else {
...
}
}发布于 2016-09-13 14:19:51
首先,我们需要了解iskindofClass和isMemberOfClass之间的差异。
返回一个布尔值,该值指示接收方是给定类的实例还是继承自该类的任何类的实例。 是的,如果接收方是aClass的实例或继承自aClass的任何类的实例,则为否。
返回一个布尔值,该值指示接收方是否是给定类的实例。 是的,如果接收方是aClass的一个实例,则为否。
然后非常重要
一个NSValue对象是单个C或object数据项的简单容器。它可以保存任何标量类型,如int、float和char,以及指针、结构和对象id引用。使用该类可以处理集合(如NSArray和NSSet)、键值编码和其他需要目标C对象的API中的此类数据类型。NSValue对象总是不可变的。
NSNumber是NSValue的子类,它提供的值为任何C标量(数值)类型的。它定义了一组方法,专门用于将值设置和访问为有符号或无符号字符、短int、int、长int、长int、float或double或BOOL。(请注意,number对象不一定保留使用它们创建的类型。)它还定义了一个比较:方法来确定两个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对象。
https://stackoverflow.com/questions/39471308
复制相似问题