web-dev-qa-db-ja.com

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?
}

私が間違っていることへのポインタは素晴らしいでしょう:)

42
Kali Aney

単純な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
}
77
ayaio

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 }
6
Sergei Petunin

簡単な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!)
}

こちらのドキュメントを参照

4
gskspurs

photosプロパティはオプション配列であり、要素にアクセスする前にラップを解除する必要があります(配列のcountプロパティを取得する場合と同じです)。

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