Использование точечной нотации для пользовательских классов - PullRequest
0 голосов
/ 18 февраля 2012

Мне всегда было интересно об этом.

У меня есть @property с именем hitCounter, и это прекрасно работает:

if ([[someArray objectAtIndex:i] hitCounter]!=0) continue;

Нет проблем, это работает,Нет метода получения 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 - что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2012

Вы должны поставить (MyClass*)[someArray objectAtIndex:i] в скобках:

if (((MyClass*)[someArray objectAtIndex:i]).hitCounter!=0) continue;
0 голосов
/ 18 февраля 2012

Компилятор сообщает, что свойство hitCounter не найдено в объекте типа id, но ясно, что я преобразую его в MyClass, чтобы он больше не был идентификатором типа - что здесь происходит?

Это просто проблема приоритета оператора.Вы приводите результат всего выражения [someArray objectAtIndex:i].hitCounter к MyClass*, но ожидаете, что приведение будет применено только к [someArray objectAtIndex:i].Используйте скобки, чтобы исправить ситуацию, как показано в ответе sch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...