前提・実現したいこと
楽天APIから検索情報を取得する際、画像を取得してImageViewに表示したい。
Codable、URLSessionでデバッグエリアに表示済み
発生している問題・エラーメッセージ
デバッグエリアではちゃんと商品名や価格、リンク先などとともに画像URLが取得できていますが、
debug
1json: ResultList(Items: [ 2アプリ名.items(Item: 3アプリ名.item(mediumImageUrls: [ 4アプリ名.Image(imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_1.jpg?_ex=128x128"), 5アプリ名.Image(imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_2.jpg?_ex=128x128"), 6アプリ名.Image(imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_3.jpg?_ex=128x128")], 7itemName: "[Rakuten Fashion]【SALE/81%OFF】(W)PECORAフェザーPO B.C STOCK ベーセーストック カットソー カットソーその他 ホワイト【RBA 8・・・
モデルから呼び出す際(下記)に型関連の何かで
error
1Value of type '[Image]' has no member 'imageUrl'
というエラーが出てしまいます。
該当のソースコード
JSON
1{ 2Items: [ 3{ 4Item: { 5mediumImageUrls: [ 6{ 7imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_1.jpg?_ex=128x128" 8}, 9{ 10imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_2.jpg?_ex=128x128" 11}, 12{ 13imageUrl: "https://thumbnail.image.rakuten.co.jp/@0_mall/bcstock/cabinet/item/249/ak4249-01_3.jpg?_ex=128x128" 14} 15], 16itemName: "[Rakuten Fashion]【SALE/81%OFF】(W)PECORAフェザーPO B.C STOCK ベーセーストック カットソー カットソーその他 ホワイト【RBA_E】", 17itemPrice: 990, 18shopUrl: "https://www.rakuten.co.jp/bcstock/", 19・・・
モデルはCodableを使用
Model
1struct ResultList: Codable { 2 3 let Items :[items] 4} 5 6struct items :Codable{ 7 let Item :item 8} 9 10struct item: Codable { 11 12 let mediumImageUrls:[Image] 13 let itemName:String 14 let itemPrice: Int 15 let shopName:String 16 let shopUrl:String 17} 18 19struct Image: Codable { 20 let imageUrl: String 21}
【該当の部分】
「itemData.Item.mediumImageUrls.imageUrl」で「Value of type '[Image]' has no member 'imageUrl'」と言われる。でも確実に[Image]の中にはimageUrlが入ってます。
Swift
1 func setData(_ itemData: items) { 2 3 self.itemNameLabel.text = itemData.Item.itemName 4 self.priceLabel.text = String("¥(itemData.Item.itemPrice)") 5 self.shopUrlButton.setTitle(itemData.Item.shopName, for: .normal) 6 7 8 if let url = URL(string: itemData.Item.mediumImageUrls.imageUrl ?? ""){ 9 let data = try! Data(contentsOf: url) 10 self.itemImaegView.image = UIImage(data: data) 11 12 } 13 }
let mediumImageUrls:[Image]の配列の中身が「imageUrl」という同じ名前が3つ入っているのが問題でしょうか?
試したこと
とりあえず、「imageUrl」という同じ名前が3つ入っている配列からは.firstでインデックスの最初のものを取得するようにし、
let imageString = itemData.Item.smallImageUrls.first! if let url = URL(string: imageString ?? ""){ let data = try! Data(contentsOf: url) self.itemImaegView.image = UIImage(data: data) }
しかし今度はimageStringで下記エラーが発生
Cannot convert value of type 'Image' to expected argument type 'String?'
いろいろキャストしようとするが、どうにもなりません。
let imageString = itemData.Item.smallImageUrls.first! as Any let imageString = String(itemData.Item.smallImageUrls.first!) let imageString = itemData.Item.smallImageUrls.first! as LosslessStringConvertible
補足情報(FW/ツールのバージョンなど)
- Swift5
- Xcode11.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/05 08:33