質問編集履歴

1

コードと出ているエラーを追加しました

2018/09/12 21:04

投稿

denshatrain
denshatrain

スコア16

test CHANGED
File without changes
test CHANGED
@@ -34,23 +34,23 @@
34
34
 
35
35
  "kind": "youtube#searchResult",
36
36
 
37
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/tTWYhBhibtZt8pBWHI5zlWCjXsw\"",
37
+ "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/n8MR9oEibzEjQGRvkJ2YD_uMgIo\"",
38
38
 
39
39
  "id": {
40
40
 
41
41
  "kind": "youtube#video",
42
42
 
43
- "videoId": "AZ3-j7IzKro"
43
+ "videoId": "pCQ8LDrTXbE"
44
44
 
45
45
  },
46
46
 
47
47
  "snippet": {
48
48
 
49
- "publishedAt": "2015-12-04T09:30:00.000Z",
49
+ "publishedAt": "2016-08-12T09:30:01.000Z",
50
50
 
51
51
  "channelId": "UCEzPCE4ULESqrp2m013wrlA",
52
52
 
53
- "title": "【Minecraft】本物感!?なロマンエレーター【へぼてっく】",
53
+ "title": "【Minecraft】うるさいけどロマンスカレーター【へぼてっく】",
54
54
 
55
55
  "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
56
56
 
@@ -58,7 +58,7 @@
58
58
 
59
59
  "default": {
60
60
 
61
- "url": "https://i.ytimg.com/vi/AZ3-j7IzKro/default.jpg",
61
+ "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/default.jpg",
62
62
 
63
63
  "width": 120,
64
64
 
@@ -68,7 +68,7 @@
68
68
 
69
69
  "medium": {
70
70
 
71
- "url": "https://i.ytimg.com/vi/AZ3-j7IzKro/mqdefault.jpg",
71
+ "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/mqdefault.jpg",
72
72
 
73
73
  "width": 320,
74
74
 
@@ -78,7 +78,7 @@
78
78
 
79
79
  "high": {
80
80
 
81
- "url": "https://i.ytimg.com/vi/AZ3-j7IzKro/hqdefault.jpg",
81
+ "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/hqdefault.jpg",
82
82
 
83
83
  "width": 480,
84
84
 
@@ -100,23 +100,23 @@
100
100
 
101
101
  "kind": "youtube#searchResult",
102
102
 
103
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/FcsKmRESULRj8hhwzgqBr7UDLpc\"",
103
+ "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Q_XYdMQnRI09uy066b4JDGYJHX4\"",
104
104
 
105
105
  "id": {
106
106
 
107
107
  "kind": "youtube#video",
108
108
 
109
- "videoId": "3CoNVop-blg"
109
+ "videoId": "3gaRTWP8jwI"
110
110
 
111
111
  },
112
112
 
113
113
  "snippet": {
114
114
 
115
- "publishedAt": "2015-01-21T09:30:02.000Z",
115
+ "publishedAt": "2015-02-06T09:00:16.000Z",
116
116
 
117
117
  "channelId": "UCEzPCE4ULESqrp2m013wrlA",
118
118
 
119
- "title": "【Minecraft】クマムシのあったかいんだからぁ♪演奏してみた【へぼてっく】",
119
+ "title": "【Minecraft】完全水抜き海底神殿で迷うw【へぼてっく】",
120
120
 
121
121
  "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
122
122
 
@@ -124,7 +124,7 @@
124
124
 
125
125
  "default": {
126
126
 
127
- "url": "https://i.ytimg.com/vi/3CoNVop-blg/default.jpg",
127
+ "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/default.jpg",
128
128
 
129
129
  "width": 120,
130
130
 
@@ -134,7 +134,7 @@
134
134
 
135
135
  "medium": {
136
136
 
137
- "url": "https://i.ytimg.com/vi/3CoNVop-blg/mqdefault.jpg",
137
+ "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/mqdefault.jpg",
138
138
 
139
139
  "width": 320,
140
140
 
@@ -144,7 +144,7 @@
144
144
 
145
145
  "high": {
146
146
 
147
- "url": "https://i.ytimg.com/vi/3CoNVop-blg/hqdefault.jpg",
147
+ "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/hqdefault.jpg",
148
148
 
149
149
  "width": 480,
150
150
 
@@ -166,23 +166,23 @@
166
166
 
167
167
  "kind": "youtube#searchResult",
168
168
 
169
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/n8MR9oEibzEjQGRvkJ2YD_uMgIo\"",
169
+ "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/J3jkHc1QCoTbjo5VVrt58e7rIy0\"",
170
170
 
171
171
  "id": {
172
172
 
173
173
  "kind": "youtube#video",
174
174
 
175
- "videoId": "pCQ8LDrTXbE"
175
+ "videoId": "lYU4Hmnov00"
176
176
 
177
177
  },
178
178
 
179
179
  "snippet": {
180
180
 
181
- "publishedAt": "2016-08-12T09:30:01.000Z",
181
+ "publishedAt": "2016-05-20T09:30:00.000Z",
182
182
 
183
183
  "channelId": "UCEzPCE4ULESqrp2m013wrlA",
184
184
 
185
- "title": "【Minecraft】うるさいけどロマンなエスカレーター【へぼてっく】",
185
+ "title": "【Minecraft】Gホイホイ的なエンダマントラップー【へぼてっく】",
186
186
 
187
187
  "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
188
188
 
@@ -190,7 +190,7 @@
190
190
 
191
191
  "default": {
192
192
 
193
- "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/default.jpg",
193
+ "url": "https://i.ytimg.com/vi/lYU4Hmnov00/default.jpg",
194
194
 
195
195
  "width": 120,
196
196
 
@@ -200,7 +200,7 @@
200
200
 
201
201
  "medium": {
202
202
 
203
- "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/mqdefault.jpg",
203
+ "url": "https://i.ytimg.com/vi/lYU4Hmnov00/mqdefault.jpg",
204
204
 
205
205
  "width": 320,
206
206
 
@@ -210,7 +210,7 @@
210
210
 
211
211
  "high": {
212
212
 
213
- "url": "https://i.ytimg.com/vi/pCQ8LDrTXbE/hqdefault.jpg",
213
+ "url": "https://i.ytimg.com/vi/lYU4Hmnov00/hqdefault.jpg",
214
214
 
215
215
  "width": 480,
216
216
 
@@ -226,390 +226,6 @@
226
226
 
227
227
  }
228
228
 
229
- },
230
-
231
- {
232
-
233
- "kind": "youtube#searchResult",
234
-
235
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Q_XYdMQnRI09uy066b4JDGYJHX4\"",
236
-
237
- "id": {
238
-
239
- "kind": "youtube#video",
240
-
241
- "videoId": "3gaRTWP8jwI"
242
-
243
- },
244
-
245
- "snippet": {
246
-
247
- "publishedAt": "2015-02-06T09:00:16.000Z",
248
-
249
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
250
-
251
- "title": "【Minecraft】完全水抜き海底神殿で迷うw【へぼてっく】",
252
-
253
- "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
254
-
255
- "thumbnails": {
256
-
257
- "default": {
258
-
259
- "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/default.jpg",
260
-
261
- "width": 120,
262
-
263
- "height": 90
264
-
265
- },
266
-
267
- "medium": {
268
-
269
- "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/mqdefault.jpg",
270
-
271
- "width": 320,
272
-
273
- "height": 180
274
-
275
- },
276
-
277
- "high": {
278
-
279
- "url": "https://i.ytimg.com/vi/3gaRTWP8jwI/hqdefault.jpg",
280
-
281
- "width": 480,
282
-
283
- "height": 360
284
-
285
- }
286
-
287
- },
288
-
289
- "channelTitle": "へぼてっくちゃんねる",
290
-
291
- "liveBroadcastContent": "none"
292
-
293
- }
294
-
295
- },
296
-
297
- {
298
-
299
- "kind": "youtube#searchResult",
300
-
301
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/VYr4h4fF0rWK4wXXSbnbYpV2B4M\"",
302
-
303
- "id": {
304
-
305
- "kind": "youtube#video",
306
-
307
- "videoId": "MfDgr6CRBxU"
308
-
309
- },
310
-
311
- "snippet": {
312
-
313
- "publishedAt": "2014-12-26T10:00:02.000Z",
314
-
315
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
316
-
317
- "title": "【Minecraft】全方位火炎機関砲【へぼてっく】",
318
-
319
- "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
320
-
321
- "thumbnails": {
322
-
323
- "default": {
324
-
325
- "url": "https://i.ytimg.com/vi/MfDgr6CRBxU/default.jpg",
326
-
327
- "width": 120,
328
-
329
- "height": 90
330
-
331
- },
332
-
333
- "medium": {
334
-
335
- "url": "https://i.ytimg.com/vi/MfDgr6CRBxU/mqdefault.jpg",
336
-
337
- "width": 320,
338
-
339
- "height": 180
340
-
341
- },
342
-
343
- "high": {
344
-
345
- "url": "https://i.ytimg.com/vi/MfDgr6CRBxU/hqdefault.jpg",
346
-
347
- "width": 480,
348
-
349
- "height": 360
350
-
351
- }
352
-
353
- },
354
-
355
- "channelTitle": "へぼてっくちゃんねる",
356
-
357
- "liveBroadcastContent": "none"
358
-
359
- }
360
-
361
- },
362
-
363
- {
364
-
365
- "kind": "youtube#searchResult",
366
-
367
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/13ICQNL_CZzK09hgr4K5oWDSdKw\"",
368
-
369
- "id": {
370
-
371
- "kind": "youtube#video",
372
-
373
- "videoId": "IRotNDNUAZY"
374
-
375
- },
376
-
377
- "snippet": {
378
-
379
- "publishedAt": "2015-08-14T09:30:00.000Z",
380
-
381
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
382
-
383
- "title": "【Minecraft】赤髪のともさんの「ダイヤモンド」フルver.演奏してみた【へぼてっく】",
384
-
385
- "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
386
-
387
- "thumbnails": {
388
-
389
- "default": {
390
-
391
- "url": "https://i.ytimg.com/vi/IRotNDNUAZY/default.jpg",
392
-
393
- "width": 120,
394
-
395
- "height": 90
396
-
397
- },
398
-
399
- "medium": {
400
-
401
- "url": "https://i.ytimg.com/vi/IRotNDNUAZY/mqdefault.jpg",
402
-
403
- "width": 320,
404
-
405
- "height": 180
406
-
407
- },
408
-
409
- "high": {
410
-
411
- "url": "https://i.ytimg.com/vi/IRotNDNUAZY/hqdefault.jpg",
412
-
413
- "width": 480,
414
-
415
- "height": 360
416
-
417
- }
418
-
419
- },
420
-
421
- "channelTitle": "へぼてっくちゃんねる",
422
-
423
- "liveBroadcastContent": "none"
424
-
425
- }
426
-
427
- },
428
-
429
- {
430
-
431
- "kind": "youtube#searchResult",
432
-
433
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/DYcpvB4BOn60I7OYQdADqPTRk6A\"",
434
-
435
- "id": {
436
-
437
- "kind": "youtube#video",
438
-
439
- "videoId": "mqei9HJIkmY"
440
-
441
- },
442
-
443
- "snippet": {
444
-
445
- "publishedAt": "2014-12-16T11:49:46.000Z",
446
-
447
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
448
-
449
- "title": "【Minecraft】扉なし!溶岩セキュリティハウス【へぼてっく】",
450
-
451
- "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
452
-
453
- "thumbnails": {
454
-
455
- "default": {
456
-
457
- "url": "https://i.ytimg.com/vi/mqei9HJIkmY/default.jpg",
458
-
459
- "width": 120,
460
-
461
- "height": 90
462
-
463
- },
464
-
465
- "medium": {
466
-
467
- "url": "https://i.ytimg.com/vi/mqei9HJIkmY/mqdefault.jpg",
468
-
469
- "width": 320,
470
-
471
- "height": 180
472
-
473
- },
474
-
475
- "high": {
476
-
477
- "url": "https://i.ytimg.com/vi/mqei9HJIkmY/hqdefault.jpg",
478
-
479
- "width": 480,
480
-
481
- "height": 360
482
-
483
- }
484
-
485
- },
486
-
487
- "channelTitle": "へぼてっくちゃんねる",
488
-
489
- "liveBroadcastContent": "none"
490
-
491
- }
492
-
493
- },
494
-
495
- {
496
-
497
- "kind": "youtube#searchResult",
498
-
499
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/CeJP03VBo1LYf1ZxRuUPCww3fzE\"",
500
-
501
- "id": {
502
-
503
- "kind": "youtube#channel",
504
-
505
- "channelId": "UCEzPCE4ULESqrp2m013wrlA"
506
-
507
- },
508
-
509
- "snippet": {
510
-
511
- "publishedAt": "2014-12-16T09:24:46.000Z",
512
-
513
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
514
-
515
- "title": "へぼてっくちゃんねる",
516
-
517
- "description": "星の数ほどある素晴らしいYouTubeチャンネルの中から 私の所へ来ていただいて本当にありがとうございます! Minecraftで「へぼいテクニック」を出...",
518
-
519
- "thumbnails": {
520
-
521
- "default": {
522
-
523
- "url": "https://yt3.ggpht.com/--vY6fGXC4Zg/AAAAAAAAAAI/AAAAAAAAAAA/CEPYWYbUQj8/s88-c-k-no-mo-rj-c0xffffff/photo.jpg"
524
-
525
- },
526
-
527
- "medium": {
528
-
529
- "url": "https://yt3.ggpht.com/--vY6fGXC4Zg/AAAAAAAAAAI/AAAAAAAAAAA/CEPYWYbUQj8/s240-c-k-no-mo-rj-c0xffffff/photo.jpg"
530
-
531
- },
532
-
533
- "high": {
534
-
535
- "url": "https://yt3.ggpht.com/--vY6fGXC4Zg/AAAAAAAAAAI/AAAAAAAAAAA/CEPYWYbUQj8/s800-c-k-no-mo-rj-c0xffffff/photo.jpg"
536
-
537
- }
538
-
539
- },
540
-
541
- "channelTitle": "へぼてっくちゃんねる",
542
-
543
- "liveBroadcastContent": "upcoming"
544
-
545
- }
546
-
547
- },
548
-
549
- {
550
-
551
- "kind": "youtube#searchResult",
552
-
553
- "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/J3jkHc1QCoTbjo5VVrt58e7rIy0\"",
554
-
555
- "id": {
556
-
557
- "kind": "youtube#video",
558
-
559
- "videoId": "lYU4Hmnov00"
560
-
561
- },
562
-
563
- "snippet": {
564
-
565
- "publishedAt": "2016-05-20T09:30:00.000Z",
566
-
567
- "channelId": "UCEzPCE4ULESqrp2m013wrlA",
568
-
569
- "title": "【Minecraft】Gホイホイ的なエンダーマントラップタワー【へぼてっく】",
570
-
571
- "description": "へぼてっくが、ヘボいテクでマインクラフトを楽しみます。 暇つぶし程度に見てください(笑) 万が一、役に立てることがあったら嬉しいのだけど...",
572
-
573
- "thumbnails": {
574
-
575
- "default": {
576
-
577
- "url": "https://i.ytimg.com/vi/lYU4Hmnov00/default.jpg",
578
-
579
- "width": 120,
580
-
581
- "height": 90
582
-
583
- },
584
-
585
- "medium": {
586
-
587
- "url": "https://i.ytimg.com/vi/lYU4Hmnov00/mqdefault.jpg",
588
-
589
- "width": 320,
590
-
591
- "height": 180
592
-
593
- },
594
-
595
- "high": {
596
-
597
- "url": "https://i.ytimg.com/vi/lYU4Hmnov00/hqdefault.jpg",
598
-
599
- "width": 480,
600
-
601
- "height": 360
602
-
603
- }
604
-
605
- },
606
-
607
- "channelTitle": "へぼてっくちゃんねる",
608
-
609
- "liveBroadcastContent": "none"
610
-
611
- }
612
-
613
229
  }
614
230
 
615
231
  ]
@@ -622,6 +238,464 @@
622
238
 
623
239
 
624
240
 
241
+ ###今のコード
242
+
243
+
244
+
245
+ ```swift
246
+
247
+ class ItemSearchResultSet: Codable {
248
+
249
+ var items: Items
250
+
251
+
252
+
253
+ private enum CodingKeys: String, CodingKey {
254
+
255
+ case items = "items"
256
+
257
+ }
258
+
259
+ }
260
+
261
+
262
+
263
+ class Items: Codable {
264
+
265
+ var id: Id
266
+
267
+ var snippet: Snippet
268
+
269
+
270
+
271
+ private enum CodingKeys: String, CodingKey {
272
+
273
+ case id = "id"
274
+
275
+ case snippet = "snippet"
276
+
277
+ }
278
+
279
+ }
280
+
281
+
282
+
283
+ class Snippet: Codable {
284
+
285
+ var title: Title
286
+
287
+
288
+
289
+ private enum CodingKeys: String, CodingKey {
290
+
291
+ case title = "title"
292
+
293
+ }
294
+
295
+ }
296
+
297
+
298
+
299
+ class Id: Codable {
300
+
301
+ var items: [ItemData] = [ItemData]()
302
+
303
+ required init(from decoder: Decoder) throws {
304
+
305
+ let container = try decoder.container(keyedBy: CodingKeys.self)
306
+
307
+ let keys = container.allKeys.sorted {
308
+
309
+ Int($0.rawValue)! < Int($1.rawValue)!
310
+
311
+ }
312
+
313
+ for key in keys {
314
+
315
+ let item = try container.decode(ItemData.self, forKey: key)
316
+
317
+ items.append(item)
318
+
319
+ }
320
+
321
+ }
322
+
323
+
324
+
325
+ func encode(to encoder: Encoder) throws {
326
+
327
+ }
328
+
329
+
330
+
331
+ private enum CodingKeys: String, CodingKey {
332
+
333
+ case hit0 = "0"
334
+
335
+ case hit1 = "1"
336
+
337
+ case hit2 = "2"
338
+
339
+ case hit3 = "3"
340
+
341
+ case hit4 = "4"
342
+
343
+ case hit5 = "5"
344
+
345
+ case hit6 = "6"
346
+
347
+ case hit7 = "7"
348
+
349
+ case hit8 = "8"
350
+
351
+ case hit9 = "9"
352
+
353
+ case hit10 = "10"
354
+
355
+ case hit11 = "11"
356
+
357
+ case hit12 = "12"
358
+
359
+ case hit13 = "13"
360
+
361
+ case hit14 = "14"
362
+
363
+ case hit15 = "15"
364
+
365
+ case hit16 = "16"
366
+
367
+ case hit17 = "17"
368
+
369
+ case hit18 = "18"
370
+
371
+ case hit19 = "19"
372
+
373
+ case hit20 = "20"
374
+
375
+ }
376
+
377
+
378
+
379
+ }
380
+
381
+
382
+
383
+ class Title: Codable {
384
+
385
+ var items: [ItemData] = [ItemData]()
386
+
387
+ required init(from decoder: Decoder) throws {
388
+
389
+ let container = try decoder.container(keyedBy: CodingKeys.self)
390
+
391
+ let keys = container.allKeys.sorted {
392
+
393
+ Int($0.rawValue)! < Int($1.rawValue)!
394
+
395
+ }
396
+
397
+ for key in keys {
398
+
399
+ let item = try container.decode(ItemData.self, forKey: key)
400
+
401
+ items.append(item)
402
+
403
+ }
404
+
405
+ }
406
+
407
+
408
+
409
+ func encode(to encoder: Encoder) throws {
410
+
411
+ }
412
+
413
+
414
+
415
+ private enum CodingKeys: String, CodingKey {
416
+
417
+ case hit0 = "0"
418
+
419
+ case hit1 = "1"
420
+
421
+ case hit2 = "2"
422
+
423
+ case hit3 = "3"
424
+
425
+ case hit4 = "4"
426
+
427
+ case hit5 = "5"
428
+
429
+ case hit6 = "6"
430
+
431
+ case hit7 = "7"
432
+
433
+ case hit8 = "8"
434
+
435
+ case hit9 = "9"
436
+
437
+ case hit10 = "10"
438
+
439
+ case hit11 = "11"
440
+
441
+ case hit12 = "12"
442
+
443
+ case hit13 = "13"
444
+
445
+ case hit14 = "14"
446
+
447
+ case hit15 = "15"
448
+
449
+ case hit16 = "16"
450
+
451
+ case hit17 = "17"
452
+
453
+ case hit18 = "18"
454
+
455
+ case hit19 = "19"
456
+
457
+ case hit20 = "20"
458
+
459
+ }
460
+
461
+
462
+
463
+ }
464
+
465
+
466
+
467
+ class ItemData: Codable {
468
+
469
+ var title: String = ""
470
+
471
+ var videoId: String = ""
472
+
473
+
474
+
475
+ private enum CodingKeys: String, CodingKey {
476
+
477
+ // case title = "title"
478
+
479
+ case videoId = "videoId"
480
+
481
+ }
482
+
483
+
484
+
485
+ }
486
+
487
+
488
+
489
+
490
+
491
+
492
+
493
+ class ViewController: UIViewController , UISearchBarDelegate {
494
+
495
+
496
+
497
+ @IBOutlet var searchBar: UISearchBar!
498
+
499
+
500
+
501
+ var itemDataArray = [ItemData]()
502
+
503
+
504
+
505
+ let appid = "AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY"
506
+
507
+
508
+
509
+ let entryUrl: String = "https://www.googleapis.com/youtube/v3/search?key=AIzaSyCAIznRo4MUdgBtijMnd2De9YEUqMdmwaY&q="
510
+
511
+
512
+
513
+ override func viewDidLoad() {
514
+
515
+ super.viewDidLoad()
516
+
517
+ // Do any additional setup after loading the view, typically from a nib.
518
+
519
+
520
+
521
+ searchBar.placeholder = "ここに入力してください"
522
+
523
+ searchBar.delegate = self
524
+
525
+ }
526
+
527
+
528
+
529
+ override func didReceiveMemoryWarning() {
530
+
531
+ super.didReceiveMemoryWarning()
532
+
533
+ // Dispose of any resources that can be recreated.
534
+
535
+ }
536
+
537
+
538
+
539
+ func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
540
+
541
+
542
+
543
+ print("検索ボタンがタップされました!")
544
+
545
+
546
+
547
+ guard let inputText = searchBar.text else {
548
+
549
+ return
550
+
551
+ }
552
+
553
+
554
+
555
+ guard inputText.lengthOfBytes(using: String.Encoding.utf8) > 0 else {
556
+
557
+ return
558
+
559
+ }
560
+
561
+
562
+
563
+ itemDataArray.removeAll()
564
+
565
+
566
+
567
+ let parameter = ["appid": appid, "query": inputText]
568
+
569
+
570
+
571
+ guard let escapedInputText = inputText.addingPercentEncoding(
572
+
573
+ withAllowedCharacters: CharacterSet.urlQueryAllowed
574
+
575
+ ) else {
576
+
577
+ return
578
+
579
+ }
580
+
581
+ let requestUrl = entryUrl + escapedInputText + "&part=snippet&maxResults=10&order=viewCount"
582
+
583
+
584
+
585
+
586
+
587
+ request(requestUrl: requestUrl)
588
+
589
+
590
+
591
+ searchBar.resignFirstResponder()
592
+
593
+ print(itemDataArray)
594
+
595
+ }
596
+
597
+
598
+
599
+ func request(requestUrl: String) {
600
+
601
+ print(1)
602
+
603
+
604
+
605
+ guard let url = URL(string: requestUrl) else {
606
+
607
+ return
608
+
609
+ }
610
+
611
+
612
+
613
+ let request = URLRequest(url: url)
614
+
615
+ let session = URLSession.shared
616
+
617
+ let task = session.dataTask (with: request) { (data:Data?, response:URLResponse?, error:Error?) in
618
+
619
+ guard error == nil else {
620
+
621
+ let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: .alert)
622
+
623
+ DispatchQueue.main.async {
624
+
625
+ self.present(alert, animated: true, completion: nil)
626
+
627
+ }
628
+
629
+ return
630
+
631
+ }
632
+
633
+
634
+
635
+ guard let data = data else {
636
+
637
+ return
638
+
639
+ }
640
+
641
+
642
+
643
+ do {
644
+
645
+ let resultSet = try JSONDecoder().decode(ItemSearchResultSet.self, from: data)
646
+
647
+
648
+
649
+ self.itemDataArray.append(contentsOf: resultSet.items.id.items)
650
+
651
+ // self.itemDataArray.append(contentsOf: resultSet.items.snippet.title.items)
652
+
653
+ print("データーが追加されました")
654
+
655
+ print(self.itemDataArray)
656
+
657
+ } catch let error {
658
+
659
+ print("## error: (error)")
660
+
661
+ }
662
+
663
+ DispatchQueue.main.async {
664
+
665
+ // self.tableView.reloadData()
666
+
667
+ }
668
+
669
+ }
670
+
671
+ print(2)
672
+
673
+ task.resume()
674
+
675
+ }
676
+
677
+ }
678
+
679
+ ```
680
+
681
+
682
+
683
+ ###エラー
684
+
685
+
686
+
687
+ コンソールに
688
+
689
+ ```
690
+
691
+ ## error: keyNotFound(CodingKeys(stringValue: "items", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"items\", intValue: nil) (\"items\").", underlyingError: nil))
692
+
693
+ ```
694
+
695
+ と表示されています。
696
+
697
+
698
+
625
699
  ###困っている点
626
700
 
627
701
 
@@ -632,7 +706,7 @@
632
706
 
633
707
 
634
708
 
635
- ### 補足情報(FW/ツールのバージョンなど)
709
+ ### 補足情報
636
710
 
637
711
 
638
712