質問編集履歴

1

書籍の改善

2021/03/02 18:27

投稿

kamiyama-jota
kamiyama-jota

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,4 @@
1
- ### 前提・実現したい
1
+ ```こに言語を入力
2
-
3
-
4
2
 
5
3
  class ViewController: UIViewController , UISearchBarDelegate {
6
4
 
@@ -206,6 +204,214 @@
206
204
 
207
205
  // ダウンロード開始
208
206
 
207
+ task.resume()```### 前提・実現したいこと
208
+
209
+
210
+
211
+ class ViewController: UIViewController , UISearchBarDelegate {
212
+
213
+
214
+
215
+ override func viewDidLoad() {
216
+
217
+ super.viewDidLoad()
218
+
219
+ // Do any additional setup after loading the view.
220
+
221
+
222
+
223
+ // Search Barのdelegate通知を設定
224
+
225
+ searchText.delegate = self
226
+
227
+ // 入力のヒントとなる、プレースホルダーを設定
228
+
229
+ searchText.placeholder = "お菓子の名前を入力してください"
230
+
231
+
232
+
233
+ }
234
+
235
+
236
+
237
+ @IBOutlet weak var searchText: UISearchBar!
238
+
239
+ @IBOutlet weak var tableView: UITableView!
240
+
241
+
242
+
243
+ // お菓子のリスト(タップル配列)
244
+
245
+ var okashiList : [(name:String , maker:String , link:URL , image:URL)] = []
246
+
247
+
248
+
249
+ // 検索ボタンをクリック (タップ) 時
250
+
251
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
252
+
253
+ // キーボードを閉じる
254
+
255
+ view.endEditing(true)
256
+
257
+
258
+
259
+ if let searchWord = searchBar.text {
260
+
261
+ // デバックエリアに出力
262
+
263
+ print(searchWord)
264
+
265
+ // 入力されていたら、お菓子を検索
266
+
267
+ searchOkashi(keyword: searchWord)
268
+
269
+ }
270
+
271
+ }
272
+
273
+ //JSONのitem内のデータ構造
274
+
275
+ struct ItemJson: Codable {
276
+
277
+ //お菓子の名称
278
+
279
+ let name: String?
280
+
281
+ //掲載URL
282
+
283
+ let url: URL?
284
+
285
+ //画像URL
286
+
287
+ let image: URL?
288
+
289
+ }
290
+
291
+
292
+
293
+ //JSONのデータ構造
294
+
295
+ struct ResultJson: Codable {
296
+
297
+ //複数要素
298
+
299
+ let item:[ItemJson]?
300
+
301
+ }
302
+
303
+
304
+
305
+ // searchOkashiメゾット
306
+
307
+ // 第一引数:keyword 検索したいワード
308
+
309
+ func searchOkashi(keyword : String){
310
+
311
+ // お菓子の検索キーワードをURLエンコードする
312
+
313
+ guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
314
+
315
+ return
316
+
317
+ }
318
+
319
+
320
+
321
+ // リクエストURLの組み立て
322
+
323
+ guard let req_url = URL(string:
324
+
325
+ "https://sysbird.jp/toriko/api/?apikey=guest&format=json&keyword=(keyword_encode)&max=10&order=r") else {
326
+
327
+ return
328
+
329
+ }
330
+
331
+ print(req_url)
332
+
333
+
334
+
335
+ // リクエストに必要な情報を生成
336
+
337
+ let req = URLRequest(url: req_url)
338
+
339
+ // データ転送を管理するためのセッションを生成
340
+
341
+ let session = URLSession(configuration: .default, delegate: nil,delegateQueue: OperationQueue.main)
342
+
343
+ // リクエストをタスクとして登録
344
+
345
+ let task = session.dataTask(with: req,completionHandler: {
346
+
347
+ (sataa , response , error) in
348
+
349
+ // セッションを終了
350
+
351
+ session.finishTasksAndInvalidate()
352
+
353
+ // dotry catch エラーハンドリング
354
+
355
+ do {
356
+
357
+ // JSONDecoderのインスタンス取得
358
+
359
+ let decoder = JSONDecoder()
360
+
361
+ // 受け取ったJSONデータをバース(解析)して格納
362
+
363
+ let json = try decoder.decode(ResultJson.self, from: data!)←ここです。
364
+
365
+
366
+
367
+ // お菓子の情報が取得できているか確認
368
+
369
+ if let items = json.item {
370
+
371
+ // 取得しているお菓子の数だけ処理
372
+
373
+ for item in items {
374
+
375
+ // お菓子の名所、メ−カー名、掲載URL、画像URL、をアンラップ
376
+
377
+ if let name = item.name , let maker = intem.maker , let link = item.url , let image = item.image {
378
+
379
+ // 1つのお菓子をダブルでまとめて管理
380
+
381
+ let okashi = (name,maker,link,image)
382
+
383
+ // お菓子の配列へ追加
384
+
385
+ self.okashiList.append(okashi)
386
+
387
+ }
388
+
389
+ }
390
+
391
+ if let okashidbg = self.okashiList.first {
392
+
393
+ print ("----------------")
394
+
395
+ print ("okashiList[0] = (okashidbg)")
396
+
397
+ }
398
+
399
+ }
400
+
401
+ } catch {
402
+
403
+ // エラー処理
404
+
405
+ print("エラーが出ました")
406
+
407
+
408
+
409
+ }
410
+
411
+ })
412
+
413
+ // ダウンロード開始
414
+
209
415
  task.resume()
210
416
 
211
417