###前提・実現したいこと
iOSでAPIを利用したい。
前にも似たような質問をしているのでお恥ずかしい限りですが、いまいち通信をする部分の作り方がよく分かっていません。
事情があってAPIのURLは晒せないのですが、下の方のprint(jsonData)はきちんと実行され、
[{"prefix_1":"bene","prefix_1_mean":"善い","prefix_1_image":"http://www.**.png","prefix_2":"","prefix_2_mean":null,"prefix_2_image":"","radix_1":"dict","radix_1_mean":"言う","radix_1_image":"http://www..png","radix_2":"","radix_2_mean":null,"radix_2_image":"0","suffix_1":"tion","suffix_1_mean":"名詞化","suffix_1_image":"http://www..png","suffix_2":"","suffix_2_mean":null,"suffix_2_image":"","meaning":"祝福、祝祷、感謝の祈り","story_1":null,"story_2":null,"story_3":null,"story_4":null,"story_5":null,"example":"","ja_example":""}]
という結果が返ってきています。
同じ名前のString変数prefix_1にbeneを格納し、prefix_1_meanに善いを格納し...という感じにしたいのですが、うまくできません。
print(jsonData)は実行されているのにprint("ここからprefix1の中身")が実行されてないっぽいのもよく分かりません。
デバッグできない状態での質問で申し訳ないですが、アドバイスを頂けるとうれしいです。
よろしくお願いします。
###該当のソースコード
import UIKit class DetailViewController: UIViewController { @IBOutlet weak var detailWordLabel: UILabel! @IBOutlet weak var detailWordImage: UIImageView! //単語と関連画像 var word: String = String() var wordImage: String = String() //接辞・語根 var prefix1: String = String() //単語の意味 var mean: String = String() override func viewDidLoad() { super.viewDidLoad() //ラベルに単語名を設定 detailWordLabel.text = word //UIImageViewにユーザが選択した関連画像を設定 if let url = URL(string:wordImage) { let req = URLRequest(url: url) let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in if let data = data { if let anImage = UIImage(data: data) { DispatchQueue.main.async { self.detailWordImage.image = anImage } } } }) task.resume() } //とりあえずWORDはBenedictionということにする word = "benediction" //APIに接続 ////接続先URLの作成 let parameter = "WORD=\(word)" let url = "***********" let requestUrl = "\(url)?\(parameter)" //APIをリクエストする request(requestUrl: requestUrl) // Do any additional setup after loading the view. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // リクエストを行なう func request(requestUrl: String) { // URL生成 guard let url = URL(string: requestUrl) else { // URL生成失敗 return } // リクエスト生成 let request = URLRequest(url: url) // APIをコールして商品検索を行なう let session = URLSession.shared let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in // 通信完了後の処理 print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "") // エラーチェック guard error == nil else { // エラー表示 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) // UIに関する処理はメインスレッド上で行なう DispatchQueue.main.async { self.present(alert, animated: true, completion: nil) } return } // JSONで返却されたデータをパースして格納する guard let data = data else { // データなし return } // JSON形式への変換処理 guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else { // 変換失敗 return } print(jsonData) //JSONデータをパースする let prefix1 = jsonData["prefix_1"] as? String print("ここからprefix1の中身") print(prefix1) } // 通信開始 task.resume() } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. } */ }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/13 05:22