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

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

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

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

API

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

Q&A

解決済

2回答

763閲覧

SwiftでAPIからデータを取得したい

oeiqgfodgfhps

総合スコア35

Swift

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

API

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

0グッド

0クリップ

投稿2020/06/25 04:18

編集2020/06/25 04:20

API通信の学習の一環としてQiitaのAPIキーから記事のタイトルを10件取得しようと試みています。
以下のようにコードを書いたのですが、うまくいきません。どのように改善すればよろしいでしょうか?
学習のためにAlamofireやCordableといった技術は使わないで書きたいです。

Swift

1 import UIKit 2 3let urlString = "https://qiita.com/api/v2/items" 4let url = URL(fileURLWithPath: urlString) 5let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 6 if error != nil{ 7 print(error) 8 }else{ 9 for i in 1...10{ 10 let title = data![i]["title"] 11 print(title) 12 } 13 } 14} 15task.resume()

出ているエラー
let title = data![i]["title"]のところに、Value of type 'UInt8' has no subscriptsというエラーが出ています。

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

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

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

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

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

guest

回答2

0

学習のためにAlamofireやCordableといった技術は使わないで書きたいです。

ということなので、SwiftyJSONのようなフレームワークも使わないものとおもっていました。

自己解決されていますが、外部のフレームワークに頼らず標準のメソッドでやるのであればこんな感じかもしれません。

Swift

1import UIKit 2 3let urlString = "https://qiita.com/api/v2/items" 4let url = URL(string: urlString)! 5let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 6 if let error = error { 7 print(error) 8 } else { 9 guard let json = try? JSONSerialization.jsonObject(with: data!), let contents = json as? [[String: Any]] else { 10 print("Convert failed") 11 return 12 } 13 14 for line in contents { 15 var userID: String? 16 17 let title = line["title"] as? String ?? "[not found]" 18 if let user = line["user"] as? [String: Any] { 19 userID = user["id"] as? String 20 } 21 22 print("title: (title)") 23 print(" ID: (userID ?? "[not found]")") 24 } 25 } 26} 27task.resume()

記事のタイトルと作者だけ表示させていますが、その他のフィールドも同様に逐一ダウンキャストしながら得ていくことになりそうです。

投稿2020/06/25 05:31

TsukubaDepot

総合スコア5086

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

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

oeiqgfodgfhps

2020/06/25 09:15

ありがとうございます! 標準のメソッドの使用も勉強してみます!
guest

0

自己解決

SwiftyJSONを使ってマッピングすることで成功しました

投稿2020/06/25 04:38

oeiqgfodgfhps

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問