Cómo recorrer un set de objects en swift

Estoy intentando acceder a la url de un object almacenado en una matriz, pero estoy recibiendo errores, no importa qué methods estoy usando.

let userPhotos = currentUser?.photos for var i = 0; i < userPhotos!.count ; ++i { let url = userPhotos[i].url } 

Aquí me pongo

No se pudo encontrar el miembro 'url'

y con un foreach:

 for photo in userPhotos { Utils.getImageAsync(photo.url , completion: { (img: UIImage?) -> () in }) } 

Yo obtengo:

'[ModelAttachment]?' no tiene un miembro llamado 'generador'

Mi array es var photos: Array<ModelAttachment>? y mi ModelAttachment se ve así:

 class ModelAttachment :Model { var id: String? var url: String? var thumb: String? } 

Cualquier puntero a lo que estoy haciendo mal sería genial 🙂

Desenvuelva y haga descender los objects al tipo correcto, de forma segura, con if let , antes de hacer la iteración con un bucle for in simple.

 if let currentUser = currentUser, let photos = currentUser.photos as? [ModelAttachment] { for object in photos { let url = object.url } } 

También hay guard let else lugar de if let si prefiere tener el resultado disponible en el scope:

 guard let currentUser = currentUser, let photos = currentUser.photos as? [ModelAttachment] else { // break or return } // now 'photos' is available outside the guard for object in photos { let url = object.url } 

Su array de userPhotos está escrito con opción, ¡debería recuperar el object subyacente real ! (si desea un error en caso de que el object no esté allí) o ? (si desea recibir nil en url):

 let userPhotos = currentUser?.photos for var i = 0; i < userPhotos!.count ; ++i { let url = userPhotos![i].url } 

Pero para preservar un manejo seguro y nulo, es mejor utilizar un enfoque funcional, por ejemplo, con el map , como sigue:

 let urls = userPhotos?.map{ $0.url } 

Puede intentar usar el simple NSArray en syntax para iterar sobre la matriz en swift que hace que el código sea más corto. Lo siguiente está funcionando para mí:

 class ModelAttachment { var id: String? var url: String? var thumb: String? } var modelAttachementObj = ModelAttachment() modelAttachementObj.id = "1" modelAttachementObj.url = "http://www.google.com" modelAttachementObj.thumb = "thumb" var imgs: Array<ModelAttachment> = [modelAttachementObj] for img in imgs { let url = img.url NSLog(url!) } 

Ver docs aquí

La propiedad de photos es una matriz opcional y debe ser desenvuelta antes de acceder a sus elementos (igual que para get la propiedad de count de la matriz):

 for var i = 0; i < userPhotos!.count ; ++i { let url = userPhotos![i].url }