我一直都在想这个。
我有一个名为hitCounter的@property
,这很好用:
if ([[someArray objectAtIndex:i] hitCounter]!=0) continue;
没问题,有效。我写的没有getter方法hitCounter
;是因为@synthesize
对吗?
但是,属性应该允许点符号。即使属性存在,也会被合成,并且导入此数组中对象的类头,以下都不会编译:
if ([someArray objectAtIndex:i].hitCounter!=0) continue;
或
if ((MyClass*)[someArray objectAtIndex:i].hitCounter!=0) continue;
编译器说property hitCounter not found on object of type id
但很明显我将它投射到MyClass
所以它不应该再是id
类型 - 这里发生了什么?
答案 0 :(得分:3)
您应该将(MyClass*)[someArray objectAtIndex:i]
放在括号内:
if (((MyClass*)[someArray objectAtIndex:i]).hitCounter!=0) continue;
答案 1 :(得分:0)
编译器说在类型为id的对象上找不到属性hitCounter 但显然我将它投射到MyClass所以它不应该再是类型 id - 这里发生了什么?
这只是运营商优先问题。您将整个表达式[someArray objectAtIndex:i].hitCounter
的结果转换为MyClass*
,但您希望转换仅应用于[someArray objectAtIndex:i]
。使用括号来纠正这种情况,如sch的回答所示。