我经常发现自己在NSArray中将对象转换为我的类型,当我想用点表示法(而不是getter)访问它们的特定属性而不创建额外的变量。
是否有任何很酷的功能或技巧告诉objective-c我要将哪一类对象存储到NSArray中,以便编译器将数组中的对象视为我的类型,而不是id?
答案 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;
不