配列に格納されているオブジェクトの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?
}
私が間違っていることへのポインタは素晴らしいでしょう:)
単純な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
配列はオプション型です。!
(オブジェクトが存在しない場合にエラーが必要な場合)または?
(必要な場合)で実際の基本オブジェクトを取得する必要があります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 }
簡単なNSArrayin構文を使用して、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
}