【问题标题】:How to loop through an array of objects in swift如何快速循环遍历对象数组
【发布时间】:2015-08-16 05:48:35
【问题描述】:

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

let userPhotos = currentUser?.photos

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

我来了

找不到会员“网址”

还有一个foreach:

for photo in userPhotos {

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

        })
    }

我明白了:

'[模型附件]?'没有名为“生成器”的成员

我的数组是 var photos: Array&lt;ModelAttachment&gt;?,我的 ModelAttachment 看起来像这样:

class ModelAttachment :Model {
var id: String?
var url: String?
var thumb: String?
}

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

【问题讨论】:

  • 如果你声明你的照片数组为:[ModelAttachment],你应该可以使用for循环。

标签: ios arrays swift


【解决方案1】:

您可以尝试使用简单的 NSArray in 语法在 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是以前支持的,但自 Swift 3.0 以来已被弃用。请使用正式的 Swift 语法
    【解决方案3】:

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

    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
    }
    

    【讨论】:

    • 谢谢!最后,它通过像这样修改您的代码来工作:for object in userPhotos! as [ModelAttachment]
    • 你可以简单地写for object in userPhotos!,它会起作用的。但它违背了可选类型的目的。
    【解决方案4】:

    您的userPhotos 数组是选项类型的,您应该使用!(如果您希望在对象不存在时出错)或?(如果您想接收@ 987654324@ 在 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 }
    

    【讨论】:

    • 请注意 for;; 语法在 Swift 3 中不再存在
    • 这已从 Swift 3 中删除。
    猜你喜欢
    • 2015-05-19
    • 2016-09-07
    • 1970-01-01
    • 2021-08-27
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 2017-01-29
    相关资源
    最近更新 更多