这段代码:
[anArray objectAtIndex:0].aVariable
可以分为2部分:
[anArray objectAtIndex:0]
这会返回一个id
- 因为你可以将任何类型的对象放入数组中。编译器不知道此方法将返回什么类型。
.aVariable
这是求财产aVariable
在从数组返回的对象上 - 如上所述,编译器不知道这个对象是什么 - 它当然不会假设它是一个AnObject
,只是因为这是您之前添加的一两行内容。它必须单独评估每个语句。因此编译器会给出错误。
使用访问器方法时更宽容一些:
[[anArray objectAtIndex:0] aVariable];
这会给你一个警告(对象可能不会响应选择器),但它仍然会让你运行代码,幸运的是你的对象does响应该选择器,这样就不会崩溃。然而,这并不是一个安全的依赖。编译器警告是你的朋友。
如果要使用点表示法,则需要告诉编译器从数组返回什么类型的对象。这就是所谓的casting。您可以分两步执行此操作:
AnObject *returnedObject = [anArray objectAtIndex:0];
int value = returnedObject.aVariable;
或者用一堆乱七八糟的括号:
int value = ((AnObject*)[anArray objectAtIndex:0]).aVariable;
需要额外的括号才能允许您在投射时使用点表示法。如果您想使用访问器方法,则需要更少的圆括号但更多的方括号:
int value = [(AnObject*)[anArray objectAtIndex:0] aVariable];