Быстрое перечисление в OS 3.0
-
06-07-2019 - |
Вопрос
Я только что попытался скомпилировать свое приложение для 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?