質問編集履歴
1
書籍の改善
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
|
|