很多时候我会将NSArray中的对象转换为我的类型,以便使用点符号(而不是getter)访问它们的特定属性,而无需创建额外的变量。
有没有一些很酷的特性或技巧可以告诉Objective-C,我要存储哪个类的对象到NSArray中,这样编译器就会假定数组中的对象是我的类型,而不是id类型?
很多时候我会将NSArray中的对象转换为我的类型,以便使用点符号(而不是getter)访问它们的特定属性,而无需创建额外的变量。
有没有一些很酷的特性或技巧可以告诉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[0]
被转换为 [arr objectAtIndexedSubscript:0];
,因此你在分类/子类中可以通过技术手段覆盖它。但这似乎是一个可怕的想法。 - Gabriele PetronellaNSArray
进行子类化。 - Gabriele PetronellaNSArray
不是一个具体的类)。阅读此文,仔细考虑是否值得为了省略几个按键而经历所有这些麻烦。 - Gabriele Petronella在这种情况下不要使用属性。你不能说
arr[ix].myProperty
[arr[ix] myProperty]
arr [ix]
是一个 id
,因此您可以向其发送任何消息。但是属性不是这样工作的(因为它们被粘贴到语言中作为事后想法)。 - matt严格回答你的问题,不行。
没有语言支持来指示集合的参数类型,例如 NSArray<MyClass>
。
也就是说,您可以找到避免显式转换的解决方法。
由于返回的对象是 id
类型,您可以在其上调用任何现有的方法,编译器不会引起注意,除非您使用点语法符号,这种语法符号具有更严格的编译器检查。
因此,例如
NSString * name = [people[0] firstName];
NSString * name = people[0].firstName;
doesn't.
[[myArray objectAtIndex:i] property]
(或者setProperty:...
)。 - Ken Thomases