获取变量的数据类型

时间:2014-07-21 13:13:27

标签: objective-c type-conversion

@interface testing
@property NSString *email;
@property NSString *password;
@end

在另一个课程中,如何在未定义电子邮件和密码的情况下获取电子邮件的数据类型或密码。

NSArray *keys=[[NSArray alloc] init];
[keys addObject:@"email"]; 
testing *detail=[[testing alloc]init]; 
if([[detail valueForKey:keys[0]] isKindOfClass:[NSString class]])
 { NSLog("This is string class variable"); } 

但不输入if条件

1 个答案:

答案 0 :(得分:0)

获取属性类所需的只是

[email class];
[password class];

使用isKindOfClass:isMemberOfClass:甚至isSubclassOfClass:

还可以测试对象类

您可以在if statements中使用这些

if([email isKindOfClass:[NSString class]])

和/或

if([password isMemberOfClass:[NSString class]])

和/或

if([[email class] isSubclassOfClass:[NSString class]])

有关这些内容的说明,请阅读Apple Documentation on NSObject class reference.Apple Documentation on NSObject protocol reference

<强> isSubclassOfClass:

  

返回一个布尔值,指示接收类是否是给定类的子类或相同。   + (BOOL)isSubclassOfClass:(Class)aClass   参数

     

ACLASS

     

一个类对象。

     

返回值

     

如果接收类是-aClass的子类或与-aClass相同,则为,否则为NO。   可用性

     

适用于iOS 2.0及更高版本。

     

宣布进入   objc / NSObject.h

<强> isKindOfClass:

  

返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。 (需要)   - (BOOL)isKindOfClass:(Class)aClass   参数

     

ACLASS

     

表示要测试的Objective-C类的类对象。

     

返回值

     

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

     

例如,在此代码中,isKindOfClass:将返回YES,因为在Foundation中,NSArchiver类继承自NSCoder:

     

NSMutableData *myData = [NSMutableData dataWithCapacity:30];

     

id anArchiver = [[NSArchiver alloc] initForWritingWithMutableData:myData];

     

if ( [anArchiver isKindOfClass:[NSCoder class]] )

     

...

     

在类集群表示的对象上使用此方法时要小心。由于类集群的性质,您获得的对象可能并不总是您期望的类型。如果调用返回类集群的方法,则该方法返回的确切类型是您可以对该对象执行的操作的最佳指示。例如,如果方法返回指向NSArray对象的指针,则不应使用此方法来查看该数组是否可变,如以下代码所示:

     

//不要这样做!

     

if ([myArray isKindOfClass:[NSMutableArray class]])

     

{

     

// Modify the object

     

}

     

如果在代码中使用此类构造,您可能认为修改实际上不应修改的对象是可以的。这样做可能会为期望对象保持不变的其他代码产生问题。

     

如果接收者是类对象,如果aClass是相同类型的Class对象,则此方法返回YES,否则返回NO。   可用性

     

在OS X v10.0及更高版本中可用。

     

另见

     

– isMemberOfClass:

     

相关示例代码

     

QuickLookSketch      草图      草图+辅助功能

     

宣布进入   objc / NSObject.h

<强> isMemberOfClass:

  

返回一个布尔值,指示接收者是否是给定类的实例。 (需要)   - (BOOL)isMemberOfClass:(Class)aClass   参数

     

ACLASS

     

表示要测试的Objective-C类的类对象。

     

返回值

     

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

     

例如,在此代码中,isMemberOfClass:将返回NO:

     

NSMutableData *myData = [NSMutableData dataWithCapacity:30];

     

id anArchiver = [[NSArchiver alloc] initForWritingWithMutableData:myData];

     

if ([anArchiver isMemberOfClass:[NSCoder class]])

     

...

     

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

     

在OS X v10.0及更高版本中可用。

     

另见

     

– isKindOfClass:

     

宣布进入   objc / NSObject.h

修改

当尝试在另一个类中访问这些属性时(这不是您在问题中提出的问题),请执行以下操作。

Testing *testingClassIVar = [[Testing alloc] init];
[testingClassIVar email];
[testingClassIVar password];

// to get the class type of these
[[testingClassIVar email] class];
[[testingClassIVar password] class];

编辑2

OMG只是我甚至不知道你要做什么,但似乎非常错误。 NSArray未对addObject:做出回应,因此会导致代码崩溃。如果您想使用addObject:,请将NSArray更改为NSMutableArray,但除非您打算在循环中使用该数组(如果您是请指定我不会假设),那么只需访问使用[detail email]

的财产

更改为

testing *detail= [[testing alloc] init];

if([[detail email] isKindOfClass:[NSString class]]) { 
    NSLog("This is string class variable"); 
}