質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1709閲覧

APIから画像が取得できない

iOS25535009

総合スコア12

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/04 16:20

編集2020/11/04 18:13

前提・実現したいこと

楽天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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mediumImageUrlsはImageの配列なのでその要素それぞれからimageUrlを取得しなければなりません。

最初のURLだけ必要なら、提示のコードの該当部分は

swift

1if let urlString = itemData.Item.mediumImageUrls.first?.imageUrl, 2 let url = URL(string: itemData.Item.mediumImageUrls.imageUrl) { 3 .....

のようになります。

投稿2020/11/05 00:59

MasakiHori

総合スコア3391

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iOS25535009

2020/11/05 08:33

ありがとうございます!非常に勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問