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}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。