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

时间:2015-06-02 12:25:22

标签: ios arrays 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?
}

任何关于我做错的指示都会很棒:)

4 个答案:

答案 0 :(得分:75)

在使用简单的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
}

答案 1 :(得分:6)

您的userPhotos数组是选项类型,您应该使用!检索实际的基础对象(如果您想要在对象不存在时发生错误)或?(如果你想在网址中收到nil

let userPhotos = currentUser?.photos

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

但为了保护安全的零处理,你最好使用功能方法,例如map,如下所示:

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

答案 2 :(得分:4)

您可以尝试使用简单的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!)
}

See docs here

答案 3 :(得分:0)

photos属性是可选数组,必须在访问其元素之前解包(与获取数组的count属性相同): / p>

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