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