Как перебирать массив объектов в swift
Я пытаюсь получить доступ к URL-адресу объекта, хранящегося в массиве, но я получаю ошибки, не имеет значения, какие методы я использую.
let userPhotos = currentUser?.photos
for var i = 0; i < userPhotos!.count ; ++i {
let url = userPhotos[i].url
}
Здесь я получаю
Не удалось найти член 'url'
и с помощью foreach:
for photo in userPhotos {
Utils.getImageAsync(photo.url , completion: { (img: UIImage?) -> () in
})
}
Я получаю:
'[ModelAttachment]? не имеет члена с именем 'Generator'
Мой массив var photos: Array<ModelAttachment>?
, и мой ModelAttachment выглядит так:
class ModelAttachment :Model {
var id: String?
var url: String?
var thumb: String?
}
Любые указания на то, что я делаю неправильно, будут замечательными:)
Ответы
Ответ 1
Разверните и опустите объекты в нужный тип, безопасно, с помощью if let
, прежде чем выполнять итерацию с помощью простого цикла for in
.
if let currentUser = currentUser,
let photos = currentUser.photos as? [ModelAttachment]
{
for object in photos {
let url = object.url
}
}
Там также guard let else
вместо if let
, если вы предпочитаете иметь доступный результат в области видимости:
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
}
Ответ 2
Ваш массив userPhotos
задан в параметре, вы должны получить фактический базовый объект с помощью !
(если вы хотите получить ошибку в случае, если объект отсутствует) или ?
(если вы хотите получить nil
в url):
let userPhotos = currentUser?.photos
for var i = 0; i < userPhotos!.count ; ++i {
let url = userPhotos![i].url
}
Но чтобы сохранить безопасную обработку nil, вам лучше использовать функциональный подход, например, с помощью map
, например:
let urls = userPhotos?.map{ $0.url }
Ответ 3
Вы можете попробовать использовать простой синтаксис NSArray в для итерации по массиву в swift, что делает более короткий код.
Для меня работает следующее:
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!)
}
См. здесь документы
Ответ 4
Свойство photos
является необязательным массивом и должно быть развернуто перед доступом к его элементам (так же, как вы это делаете, чтобы получить свойство count
для массива):
for var i = 0; i < userPhotos!.count ; ++i {
let url = userPhotos![i].url
}