如何在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? } 

任何指针,我做错了将是伟大的:)

将对象解包并向下转换为正确的types,安全地使用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 } 

你的userPhotos数组是选项types的,你应该用!检索实际的底层对象! (如果你想要一个错误,如果对象不存在)或? (如果你想在URL中收到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 } 

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

在这里看到文档

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

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