【问题标题】:Get data type of variable获取变量的数据类型
【发布时间】:2014-09-12 00:18:45
【问题描述】:
@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条件

【问题讨论】:

  • NSString 是类类型而不是数据类型。并且 email,password 是 NSString 类的实例。您可以使用 [email class] 在任何地方访问该课程

标签: objective-c type-conversion


【解决方案1】:

你需要做的就是获取一个属性的类

[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 的子类或相同,则为YES,否则为NO。 可用性

适用于 iOS 2.0 及更高版本。

声明于 objc/NSObject.h

isKindOfClass:

返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例。 (必需的) - (BOOL)isKindOfClass:(Class)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 参数

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

返回值

如果接收者是一个类的实例,则为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 只是 NO 我什至不知道您要做什么,但这似乎非常错误。 NSArray 不响应 addObject: 所以这会使你的代码崩溃。如果您想使用addObject:,则将NSArray 更改为NSMutableArray,但除非您计划在循环中使用该数组(如果您愿意,请指定我不会假设)然后只需使用[detail email] 访问该属性

改成这个

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

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

【讨论】:

  • 我正在另一个类中创建测试对象,然后如何获取电子邮件或密码的数据类型。
  • @user2906108 看到我的编辑,但你不是很清楚你想要什么。您只是想访问这些属性还是想获取这些属性的类类型?
  • 这是我的代码 =================== NSArray *keys=[[NSArray alloc] init]; [键添加对象:@“电子邮件”];测试 *detail=[[测试分配]init]; if([[detail valueForKey:keys[0]] isKindOfClass:[NSString class]]) { NSLog("这是字符串类变量"); } 但它没有进入 if 条件
  • 您所做的只是创建一个数组并向其中添加一个表示电子邮件的字符串对象。但是,这应该会中断,因为keys 不可变,因此不会回复addObject: 请在您的问题中分享您的所有代码,我怀疑您有很多问题,因为您在刚刚分享的内容中做了你的评论。一旦您在问题中分享了所有代码,我将能够为您的问题提供更好的答案。
  • 大力水手先生,这是项目要求
猜你喜欢
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多