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