如何在swift中循环遍历一个对象数组

Kal*_*ney 43 arrays ios swift

我正在尝试访问存储在数组中的对象的url,但是我遇到了错误,无论我使用什么方法.

let userPhotos = currentUser?.photos

    for var i = 0; i < userPhotos!.count ; ++i {
        let url = userPhotos[i].url
    }
Run Code Online (Sandbox Code Playgroud)

我来了

找不到会员'url'

并与foreach:

for photo in userPhotos {

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

        })
    }
Run Code Online (Sandbox Code Playgroud)

我明白了:

'[ModelAttachment]?没有名为'Generator'的成员

我的数组是var photos: Array<ModelAttachment>?,我的ModelAttachment看起来像这样:

class ModelAttachment :Model {
var id: String?
var url: String?
var thumb: String?
}
Run Code Online (Sandbox Code Playgroud)

任何指向我做错的指针都会很棒:)

aya*_*aio 78

if let在使用简单for in循环进行迭代之前,安全地将对象解包并向下转换为正确类型.

if let currentUser = currentUser, 
    let photos = currentUser.photos as? [ModelAttachment] 
{
    for object in photos {
        let url = object.url
    }
}
Run Code Online (Sandbox Code Playgroud)

还有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
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*nin 6

你的userPhotos数组是选项类型的,你应该检索实际的底层对象!(如果你想要一个错误,如果对象不在那里)或?(如果你想nil在url中接收):

let userPhotos = currentUser?.photos

for var i = 0; i < userPhotos!.count ; ++i {
    let url = userPhotos![i].url
}
Run Code Online (Sandbox Code Playgroud)

但是为了保护安全的零处理,你最好使用功能方法,例如,使用map,像这样:

let urls = userPhotos?.map{ $0.url }
Run Code Online (Sandbox Code Playgroud)

  • 请注意,Swift 3中不存在`for ;;`语法 (2认同)
  • 这已从 Swift 3 中删除。 (2认同)