Подтвердить что ты не робот

Как перебирать массив объектов в 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?
}

Любые указания на то, что я делаю неправильно, будут замечательными:)

4b9b3361

Ответ 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
}