[英]NSArray of objects and Casting
我有一个带有属性NSString *name
A
类。 如果有一个NSArray
并在这个数组中添加了许多A
对象,那么每次检索对象时都需要进行强制转换吗? 即
NSString* n = (NSString*)[arr objectAtIndex:1];
或者是否有另一种方法可以在java中使用ArrayList<A> arr
?
NSArray
不存储有关其中包含的对象类型的信息。 如果您确定数组中的对象类型,则可以隐式或显式执行强制转换:
NSString *n = [arr objectAtIndex:1]; // implicit type conversion (coercion) from id to NSString*
NSString *n = (NSString *)[arr objectAtIndex:1]; // explicit cast
隐式和显式转换之间的运行时成本没有区别,只是风格问题。 如果你输入的类型不对,那么很可能会发生的事情是你会将可怕的unrecognized selector sent to instance 0x12345678
异常。
如果您有不同类型对象的异构数组,则需要使用isKindOfClass:
方法来测试对象的类:
id obj = [arr objectAtIndex:1];
if ([obj isKindOfClass:[NSString class] ])
{
// It's an NSString, do something with it...
NSString *str = obj;
...
}
NSArray
的objectAtIndex:
返回id
类型的变量。 这将是大致相当于返回一个Object
在Java的“我们不能保证许多关于这个变量的类型。” 但是,在Objective-C中,您可以在没有编译器抱怨的情况下向id
变量发送消息。 因此,因为您知道该数组只包含A
实例,所以您最好向其发送name
消息。 例如,以下内容将在没有警告的情况下编译:
NSString *name = [[array objectAtIndex:0] name];
但是,如果要使用点表示法(例如[array objectAtIndex:0].name
),则需要将id
转换为A *
,如下所示:
NSString *name = ((A *)[array objectAtIndex:0]).name;
这是做到这一点的方法。 实际上,您可以在不转换返回的情况下执行上述操作,因为无论如何您都要将其读入NSString。
这是方式:
NSMutableArray *objectsArray = [[NSMutableArray alloc] init];
A *a= [[A alloc] init];
[objectsArray addObject:a];
[a release];
您不必担心属性类型
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.