teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

書籍の改善

2021/03/02 18:27

投稿

kamiyama-jota
kamiyama-jota

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,108 @@
1
- ### 前提・実現したい
1
+ ```こに言語を入力
2
+ class ViewController: UIViewController , UISearchBarDelegate {
2
3
 
4
+ override func viewDidLoad() {
5
+ super.viewDidLoad()
6
+ // Do any additional setup after loading the view.
7
+
8
+ // Search Barのdelegate通知を設定
9
+ searchText.delegate = self
10
+ // 入力のヒントとなる、プレースホルダーを設定
11
+ searchText.placeholder = "お菓子の名前を入力してください"
12
+
13
+ }
14
+
15
+ @IBOutlet weak var searchText: UISearchBar!
16
+ @IBOutlet weak var tableView: UITableView!
17
+
18
+ // お菓子のリスト(タップル配列)
19
+ var okashiList : [(name:String , maker:String , link:URL , image:URL)] = []
20
+
21
+ // 検索ボタンをクリック (タップ) 時
22
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
23
+ // キーボードを閉じる
24
+ view.endEditing(true)
25
+
26
+ if let searchWord = searchBar.text {
27
+ // デバックエリアに出力
28
+ print(searchWord)
29
+ // 入力されていたら、お菓子を検索
30
+ searchOkashi(keyword: searchWord)
31
+ }
32
+ }
33
+ //JSONのitem内のデータ構造
34
+ struct ItemJson: Codable {
35
+ //お菓子の名称
36
+ let name: String?
37
+ //掲載URL
38
+ let url: URL?
39
+ //画像URL
40
+ let image: URL?
41
+ }
42
+
43
+ //JSONのデータ構造
44
+ struct ResultJson: Codable {
45
+ //複数要素
46
+ let item:[ItemJson]?
47
+ }
48
+
49
+ // searchOkashiメゾット
50
+ // 第一引数:keyword 検索したいワード
51
+ func searchOkashi(keyword : String){
52
+ // お菓子の検索キーワードをURLエンコードする
53
+ guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
54
+ return
55
+ }
56
+
57
+ // リクエストURLの組み立て
58
+ guard let req_url = URL(string:
59
+ "https://sysbird.jp/toriko/api/?apikey=guest&format=json&keyword=(keyword_encode)&max=10&order=r") else {
60
+ return
61
+ }
62
+ print(req_url)
63
+
64
+ // リクエストに必要な情報を生成
65
+ let req = URLRequest(url: req_url)
66
+ // データ転送を管理するためのセッションを生成
67
+ let session = URLSession(configuration: .default, delegate: nil,delegateQueue: OperationQueue.main)
68
+ // リクエストをタスクとして登録
69
+ let task = session.dataTask(with: req,completionHandler: {
70
+ (sataa , response , error) in
71
+ // セッションを終了
72
+ session.finishTasksAndInvalidate()
73
+ // dotry catch エラーハンドリング
74
+ do {
75
+ // JSONDecoderのインスタンス取得
76
+ let decoder = JSONDecoder()
77
+ // 受け取ったJSONデータをバース(解析)して格納
78
+ let json = try decoder.decode(ResultJson.self, from: data!)←ここです。
79
+
80
+ // お菓子の情報が取得できているか確認
81
+ if let items = json.item {
82
+ // 取得しているお菓子の数だけ処理
83
+ for item in items {
84
+ // お菓子の名所、メ−カー名、掲載URL、画像URL、をアンラップ
85
+ if let name = item.name , let maker = intem.maker , let link = item.url , let image = item.image {
86
+ // 1つのお菓子をダブルでまとめて管理
87
+ let okashi = (name,maker,link,image)
88
+ // お菓子の配列へ追加
89
+ self.okashiList.append(okashi)
90
+ }
91
+ }
92
+ if let okashidbg = self.okashiList.first {
93
+ print ("----------------")
94
+ print ("okashiList[0] = (okashidbg)")
95
+ }
96
+ }
97
+ } catch {
98
+ // エラー処理
99
+ print("エラーが出ました")
100
+
101
+ }
102
+ })
103
+ // ダウンロード開始
104
+ task.resume()```### 前提・実現したいこと
105
+
3
106
  class ViewController: UIViewController , UISearchBarDelegate {
4
107
 
5
108
  override func viewDidLoad() {