当我想用点表示法(而不是 getter)访问它们的特定属性而不创建额外的变量时,我经常发现自己将 NSArray 中的对象转换为我的类型。
是否有任何很酷的功能或技巧可以告诉objective-c我要将哪一类对象存储到NSArray,以便编译器将数组中的对象假定为我的类型,而不是id?
当我想用点表示法(而不是 getter)访问它们的特定属性而不创建额外的变量时,我经常发现自己将 NSArray 中的对象转换为我的类型。
是否有任何很酷的功能或技巧可以告诉objective-c我要将哪一类对象存储到NSArray,以便编译器将数组中的对象假定为我的类型,而不是id?
如果您的意思是您正在执行以下操作:
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;
在这种情况下不要使用属性。你不能说
arr[ix].myProperty
但你总是可以说
[arr[ix] myProperty]
严格回答你的问题,没有。
没有语言支持指示集合的参数类型,例如NSArray<MyClass>
.
也就是说,您可以找到避免显式强制转换的解决方法。
由于返回的对象是类型id
,您可以在其上调用任何现有的方法,并且编译器不会引起注意,除非您使用点语法表示法,它具有更严格的编译器检查。
所以例如
NSString * name = [people[0] firstName];
无需演员即可完美工作,而
NSString * name = people[0].firstName;
没有。