Enumeración rápida en OS 3.0
-
06-07-2019 - |
Pregunta
Acabo de intentar compilar mi aplicación de iPhone contra OS 3.0 y aparece un error de compilación cuando uso una enumeración rápida.
Estoy tratando de pasar por un NSArray que contiene clases de cComment:
for (cComment* newComment in comments.comments)
Y recibo este error
error: el tipo de descriptor de acceso no coincide con el tipo de propiedad 'comentarios'.
Esto funciona perfectamente cuando se compila con OS 2.2.1.
Entiendo el error, la enumeración no está fuertemente tipada pero, por lo que sé, los genéricos / plantillas no son compatibles con el objetivo-c. Así que actualmente solo puedo ver una forma de evitar esto:
for (id commentObject in comments.comments)
{
cComment *newComment = (cComment *)commentObject;
}
¿Alguien puede pensar de otra manera? ¿Por qué ha cambiado esto? Cualquier punto a la documentación de Apple sobre este cambio sería apreciado.
EDIT
Siguiendo la sugerencia de Grouchal probé esto: NSArray * allComments = comments.comments y obtuve el mismo error, así que parece que no se trata de la enumeración después de todo
aquí está el código del archivo de encabezado:
Comentarios NSMutableArray *;
@property (solo lectura, no atómica) comentarios NSArray *;
y la propiedad se sintetiza en el archivo de implementación.
Cambiar la propiedad a NSMutableArray parece resolver el problema, pero no veo ninguna razón por la cual este sea el caso. Cualquier idea.
Gracias.
Solución 3
Cerraré esta pregunta y haré una nueva bajo los cambios del objetivo-c para iPhone OS 3.0.
Implementé el método getter para devolver un NSArray y funciona bien. También cambiar la propiedad a NSMutableArray funciona, pero realmente no es lo que quiero hacer.
No tengo idea de por qué esto cambió. Este es un cambio de objetivo-c y no un cambio de sistema operativo. Tampoco se menciona en la documentación de los cambios entre 2.2 API 3.0 API.
Gracias a todos por responder.
Otros consejos
El problema está en la definición de la propiedad. Debes cambiarlo como:
@property (solo lectura, no atómica) NSMutableArray * comentarios
En el lado negativo, su matriz estará expuesta como mutable (aunque supongo que eso es lo que quería evitar).
No veo ninguna razón por la cual este código no debería funcionar en OS 3.0. Ya tengo un código similar funcionando.
¿Qué sucede si cambia el código a
?NSArray *commentArray = comments.comments;
for (cComment *newComment in commentArray){
.....
}
Acabo de notar que he escrito esto donde está el * en su código. ¿Es este el problema? ¿Debería ser realmente cComment * en la declaración for?