如何在Swift中遍历对象数组

47
我试图访问存储在数组中的对象的网址,但无论我使用什么方法都会出现错误。
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
如果你将你的照片数组声明为:[ModelAttachment],那么你应该能够使用for循环。 - keithbhunter
4个回答

83

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

1
谢谢!最终通过像这样修改您的代码来实现: for object in userPhotos! as [ModelAttachment] - Kalianey
你可以简单地写成 for object in userPhotos!,它会工作。但这违背了可选类型的目的。 - Forketyfork

6

您的userPhotos数组是可选类型的,如果想要在对象不存在时出现错误,则应使用!来检索实际的底层对象;如果想要在url中接收nil,则应使用?

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 }

5
请注意,在Swift 3中不再存在 for;; 语法。 - Cœur
2
这已经从Swift 3中删除了。 - Jayprakash Dubey

4
你可以尝试使用简单的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


0

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

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

6
此前曾支持,但自Swift 3.0起已被弃用。请使用正式的Swift语法。 - esreli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接