web-dev-qa-db-fra.com

Comment boucler un tableau d'objets dans swift

J'essaie d'accéder à l'URL d'un objet stocké dans un tableau, mais les erreurs que je reçois n'importent pas les méthodes que j'utilise.

let userPhotos = currentUser?.photos

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

Ici je reçois

Impossible de trouver le membre 'url'

et avec une foreach:

for photo in userPhotos {

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

        })
    }

Je reçois:

'[ModelAttachment]?' n'a pas de membre nommé 'Générateur'

Mon tableau est var photos: Array<ModelAttachment>? et mon ModelAttachment ressemble à ceci:

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

N'importe quel indicateur de ce que je fais mal serait génial :)

42
Kali Aney

Déballer et décaler les objets au bon type, en toute sécurité, avec if let, avant de faire l'itération avec un simple for in boucle.

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

Il y a aussi guard let else au lieu de if let si vous préférez que le résultat soit disponible dans le domaine d'application:

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
}
77
ayaio

Votre tableau userPhotos est typé par une option, vous devriez récupérer l'objet sous-jacent réel avec ! _ (si vous voulez une erreur au cas où l’objet n’est pas là) ou ? _ (si vous voulez recevoir nil en url):

let userPhotos = currentUser?.photos

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

Mais pour préserver la sécurité de la manipulation nil, il vaut mieux utiliser une approche fonctionnelle, par exemple avec map, comme ceci:

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

Vous pouvez essayer d’utiliser la syntaxe simple NSArray dans pour parcourir le tableau dans Swift, ce qui permet de raccourcir le code. Ce qui suit fonctionne pour moi:

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!)
}

Voir la documentation ici

4
gskspurs

La propriété photos est un tableau facultatif et doit être décompressée avant d'accéder à ses éléments (comme vous le faites pour obtenir la propriété count du tableau):

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