Objective-C:有什么技巧可以避免强制转换NSArray对象吗?

时间:2013-09-01 00:49:06

标签: objective-c foundation

我经常发现自己在NSArray中将对象转换为我的类型,当我想用​​点表示法(而不是getter)访问它们的特定属性而不创建额外的变量。

是否有任何很酷的功能或技巧告诉objective-c我要将哪一类对象存储到NSArray中,以便编译器将数组中的对象视为我的类型,而不是id?

3 个答案:

答案 0 :(得分:6)

如果你的意思是你正在做的事情:

x = ((MyClass *)[myArray objectAtIndex:2]).property1;

您可以将其拆分为两行以便于阅读:

MyClass *myObject = [myArray objectAtIndex:2]
x = myObject.property1;

如果您确实设置了第一种情况,则可以在NSArray上创建一个类别具有访问者的类别:

@implementation NSArray (MyCategory)

- (MyClass *)myClassObjectAtIndex:(NSUInteger)index
{
   return [self objectAtIndex:index];
}

@end

然后您可以按照自己的意愿使用它:

x = [myArray myClassObjectAtIndex:2].property1;

答案 1 :(得分:2)

在这种情况下不要使用属性。你不能说

arr[ix].myProperty

但你总是可以说

[arr[ix] myProperty]

答案 2 :(得分:1)

严格回答你的问题,不。

没有语言支持来指示集合的参数类型,例如NSArray<MyClass>

也就是说,您可以找到避免显式转换的变通方法。

由于返回的对象是id类型,你可以在其上调用任何 - 现有 - 方法,并且编译器不会引起人们的注意,除非你使用点语法表示法,它具有更严格的编译器检查

例如

NSString * name = [people[0] firstName];

在没有演员的情况下完美无瑕地工作,而

NSString * name = people[0].firstName;