Вопрос

Я только что попытался скомпилировать свое приложение для iPhone под управлением OS 3.0 и получаю ошибку компиляции при использовании быстрого перечисления.

Я пытаюсь пройти через NSArray, содержащий классы cComment:

for (cComment* newComment in comments.comments)

И я получаю эту ошибку

ошибка:тип средства доступа не соответствует типу свойства "комментарии".

Это работает безупречно при компиляции с OS 2.2.1.

Я понимаю ошибку, перечисление не является строго типизированным, но поскольку, насколько я знаю, дженерики / шаблоны не поддерживаются в objective-c.Так что в настоящее время я вижу только один способ обойти это:

for (id commentObject in comments.comments)
{
     cComment *newComment = (cComment *)commentObject;
}

Кто-нибудь может придумать другой способ?Почему это изменилось?Будем признательны за любые замечания к документации Apple по поводу этого изменения.

Редактировать

Следуя предложению Ворчуна, я попробовал это:NSArray * allComments = comments.комментарии и я получил ту же ошибку, так что, похоже, дело все-таки не в перечислении

вот код из заголовочного файла:

NSMutableArray *комментарии;

@property (только для чтения, неатомный) NSArray* комментарии;

и свойство синтезируется в файле реализации.

Изменение свойства на NSMutableArray, кажется, решает проблему, но я не вижу никаких причин, почему это должно быть так.Есть какие-нибудь идеи.

Спасибо.

Это было полезно?

Решение 3

Я собираюсь закрыть этот вопрос и задать новый в разделе objective-c changes для iPhone OS 3.0.

Я сам внедрил метод getter для возврата NSArray, и он работает просто отлично.Также изменение свойства на NSMutableArray работает, но на самом деле это не то, что я хочу сделать.

Я понятия не имею, почему это изменилось.Это изменение objective-c, а не изменение операционной системы.Также нет упоминания об этом в документации об изменениях между 2.2 API 3.0 API.

Спасибо всем за отклик.

Другие советы

Проблема заключается в определении свойства.Вы должны изменить его как:

@property (readonly,nonatomic) NSMutableArray* comments

С другой стороны, ваш массив будет представлен как изменяемый (хотя я полагаю, это то, что вы хотели предотвратить).

Я не вижу никаких причин, по которым этот код не должен работать в OS 3.0, у меня уже есть аналогичный код.

Что произойдет, если вы измените код на

NSArray *commentArray = comments.comments;
for (cComment *newComment in commentArray){
.....
}

Я только что заметил, когда писал это, где * находится в вашем коде - это проблема?должно ли это действительно быть cComment * в объявлении for?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top