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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2242閲覧

swiftでのapiで取得した情報のクラスオブジェクトでの管理

kikikikikiki

総合スコア12

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/09/27 05:06

編集2016/09/27 05:22

###前提・実現したいこと
swiftでのapiで取得した情報のクラスオブジェクトでの管理

###発生している問題・エラーメッセージ
以下のソースコードを書いていたところ、クラスオブジェクトで管理した方がいいと言われましたが、なかなかどう書けばいいかわからず、困っています。
使っているライブラリはalamofireとSwiftyjsonです。
ご存知の方アドバイスいただけたらありがたいです。
不足の情報などありましたらお申し付けくださいませ。
使っているapiはカーリルapi(https://calil.jp/doc/api_ref.html)です。
###該当のソースコード

Swift3.0

1class DetailViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 2 var latitude:String = "" 3 var longtitude:String = "" 4 var libraries: [[String: String?]] = [] 5 6 7 @IBOutlet weak var table: UITableView! 8 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 //let appdelegateIndetail = UIApplication.shared.delegate as! AppDelegate 14 //let latitude = appdelegateIndetail.latitude 15 //let longtitude = appdelegateIndetail.longtitude 16 17 let parameters:Parameters = [ 18 "appkey":"9500e8c7c8591a8cd5171f2d9965720a", 19 "geocode":"\(longtitude),\(latitude)", 20 "limit":"10", 21 "format":"json", 22 "callback":"" 23 24 ] 25 26 27 28 Alamofire.request("https://api.calil.jp/library", parameters:parameters,encoding:URLEncoding.default).responseJSON { response in 29 print(response.result.value) 30 guard let object = response.result.value 31 else{ 32 33 return 34 } 35 let json = JSON(object) 36 json.forEach{ (_, json) in 37 let library:[String :String?] = [ 38 39 "formal": json["formal"].string, 40 "distance" :json["distance"].string 41 42 ] 43 self.libraries.append(library) 44 } 45 print(self.libraries) 46 self.table.reloadData() 47 48 49 } 50 51 52 //table.frame = view.frame 53 table.dataSource = self 54 table.delegate = self 55 56 57 58 // Do any additional setup after loading the view. 59 } 60

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
Xcode8,Swift3.0,Alamofire,SwiftyJson

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようにするとAPIリクエストした結果をデータ(Model)の配列で受け取れます。
参考にしてみてください。

swift

1// ----- ViewController ------ 2 3import UIKit 4import Alamofire 5import SwiftyJSON 6 7class DetailViewController: UIViewController { 8 9 // 東京タワーの座標 10 var latitude :Double = 35.658581 11 var longtitude:Double = 139.745433 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 // API Request 17 APIManager.getLibraryData(latitude: latitude, longtitude: longtitude) { (librarys: Array<LibraryData>?) in 18 19 if let data = librarys?[0] { // 配列の0番目を出力 20 21 print(data.category) // MEDIUM 22 print(data.city) // 港区 23 print(data.short) // みなと図書館 24 print(data.tel) // 03-3437-6621 25 print(data.pref) // 東京都 26 print(data.geocode) // 139.7501576,35.6598873 27 print(data.systemid) // Tokyo_Minato 28 print(data.address) // 東京都港区芝公園3-2-25 29 print(data.libid) // 104074 30 print(data.libkey) // みなと図書 31 print(data.post) // 105-0011 32 print(data.url_pc) // http://www.lib.city.minato.tokyo.jp/j/minato.cgi 33 34 // tableに表示するデータ配列にdatasを代入 35 // tableView.reloadData() 等 36 } 37 } 38 } 39} 40 41// ----- API ------ 42 43class APIManager { 44 45 class func getLibraryData(latitude: Double, longtitude: Double, handler: @escaping (Array<LibraryData>?) -> ()) { 46 let parameters:Parameters = [ 47 "appkey" :"9500e8c7c8591a8cd5171f2d9965720a", 48 "geocode" :"\(longtitude),\(latitude)", 49 "limit" :"10", 50 "format" :"json", 51 "callback":"" 52 ] 53 54 Alamofire.request("https://api.calil.jp/library", parameters:parameters,encoding:URLEncoding.default).responseJSON { response in 55 56 guard let object = response.result.value else { 57 return handler(nil) 58 } 59 60 var libraries: Array<LibraryData> = [] 61 62 let json = JSON(object) 63 json.forEach{ (_, json) in 64 libraries.append(LibraryData(json: json)) 65 } 66 67 handler(libraries) 68 } 69 } 70} 71 72// ----- Model ------ 73 74struct LibraryData { 75 76 var category: String! 77 var city : String! 78 var short : String! 79 var tel : String! 80 var pref : String! 81 var geocode : String! 82 var systemid: String! 83 var address : String! 84 var libid : String! 85 var libkey : String! 86 var post : String! 87 var url_pc : String! 88 89 init(json: JSON) { 90 category = json["category"].string 91 city = json["city"].string 92 short = json["short"].string 93 tel = json["tel"].string 94 pref = json["pref"].string 95 geocode = json["geocode"].string 96 systemid = json["systemid"].string 97 address = json["address"].string 98 libid = json["libid"].string 99 libkey = json["libkey"].string 100 post = json["post"].string 101 url_pc = json["url_pc"].string 102 } 103}

投稿2016/09/29 17:40

_Kentarou

総合スコア8490

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問