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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

1964閲覧

Swift4のCodableでJsonをデコードしたデータを使いまわしたい。

Shichi7

総合スコア35

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2018/08/08 07:58

Alamofileで取ってきたJSONデータをCodableでデコードします。
APIのデータの構造は他のところで使い回せるようにクラスにしてあります。
非同期で取ってきたデータを用意しておいたapiDataという変数に代入したいのですが、それをArrayの型にしておくとデコードしたデータをうまく扱えなくなってしまいます。
非同期でJSON取得->Codableでデコード->変数に代入(メインスレッドでもデータにアクセスしたい)をしたいです。
クラスの使い方から正しくないような気もするのですが、よろしくお願いします。

swift

1class APIService { 2 struct User: Codable { 3 let name: String 4 let articles: [Article] 5 } 6 7 struct Article: Codable { 8 let title: String 9 let text: String 10 let comments: [Comment] 11 } 12 13 struct Comment: Codable { 14 let userName: String 15 let createAt: Date 16 let text: String 17 } 18}

swift

1import Alamofire 2class viewController: UIViewController { 3 var apiData: Array = [] as Array 4 // Arrayにすると、データを取り出せなくなる 5 // Codableのままなら以下で取り出せるが、 6 // print(apiData[0].articles[0].title) 7 // Arrayに代入すると 8 // print((self.apiData[0] as! Array).articles) 9 // Value of type 'Array<_>' has no member 'articles' のエラーが 10 func getData() { 11 Alamofire.request( 12 url, 13 method: .get, 14 headers: headers 15 ).response { response in 16 if let data = response.data { 17 let decoder = JSONDecoder() 18 decoder.keyDecodingStrategy = .convertFromSnakeCase 19 self.apiData = try! decoder.decode([APIService.User].self, from: data) 20 // 非同期で取得し、デコードしたデータをapiDataに代入したい!! 21 } 22 } 23 } 24}

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

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

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

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

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

guest

回答2

0

ベストアンサー

swift

1var apiData: [APIService.User] = []

に変更してください

投稿2018/08/08 08:20

MasakiHori

総合スコア3384

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

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

0

var apiData: [APIService.User] = []

で、できましたー

投稿2018/08/08 08:20

Shichi7

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問