4

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

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

4

3 回答 3

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;
于 2013-09-01T00:52:01.433 回答
2

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

arr[ix].myProperty

但你总是可以说

[arr[ix] myProperty]
于 2013-09-01T00:56:33.297 回答
1

严格回答你的问题,没有。

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

也就是说,您可以找到避免显式强制转换的解决方法。

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

所以例如

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

无需演员即可完美工作,而

NSString * name = people[0].firstName;

没有。

于 2013-09-01T00:56:39.707 回答