回答編集履歴
2
修正
answer
CHANGED
@@ -80,4 +80,177 @@
|
|
80
80
|
// 通信開始
|
81
81
|
task.resume()
|
82
82
|
}
|
83
|
+
```
|
84
|
+
|
85
|
+
回答追記
|
86
|
+
---
|
87
|
+
|
88
|
+
```swift
|
89
|
+
|
90
|
+
override func viewDidLoad() {
|
91
|
+
super.viewDidLoad()
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
let pasteboard = UIPasteboard.general
|
96
|
+
var copiedText = pasteboard.string
|
97
|
+
searchLabel.text = copiedText
|
98
|
+
// Do any additional setup after loading the view.
|
99
|
+
|
100
|
+
copiedText = "dog"
|
101
|
+
|
102
|
+
// パラメータを指定する
|
103
|
+
let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":copiedText]
|
104
|
+
dump(parameter)
|
105
|
+
|
106
|
+
// パラメータをエンコードしたURLを作成する
|
107
|
+
let requestUrl = createRequestUrl(parameter: parameter as! [String : String])
|
108
|
+
|
109
|
+
print("リクエストURLは"+requestUrl)
|
110
|
+
|
111
|
+
// APIをリクエストする
|
112
|
+
request(requestUrl: requestUrl) { result in
|
113
|
+
|
114
|
+
dump(result)
|
115
|
+
if let url = URL(string: self.wordImageArray[0]) {
|
116
|
+
let req = URLRequest(url: url)
|
117
|
+
let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in
|
118
|
+
if let data = data {
|
119
|
+
if let anImage = UIImage(data: data) {
|
120
|
+
DispatchQueue.main.async {
|
121
|
+
self.wordImage.image = anImage
|
122
|
+
}
|
123
|
+
}
|
124
|
+
}
|
125
|
+
})
|
126
|
+
task.resume()
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
|
131
|
+
override func didReceiveMemoryWarning() {
|
132
|
+
super.didReceiveMemoryWarning()
|
133
|
+
// Dispose of any resources that can be recreated.
|
134
|
+
}
|
135
|
+
|
136
|
+
// パラメータのURLエンコード処理
|
137
|
+
func encodeParameter(key: String, value: String) -> String? {
|
138
|
+
// 値をエンコードする
|
139
|
+
guard let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else {
|
140
|
+
// エンコード失敗
|
141
|
+
return nil
|
142
|
+
}
|
143
|
+
// エンコードした値をkey=valueの形式で返却する
|
144
|
+
return "\(key)=\(escapedValue)"
|
145
|
+
}
|
146
|
+
|
147
|
+
// URL作成処理
|
148
|
+
func createRequestUrl(parameter: [String: String]) -> String {
|
149
|
+
var parameterString = ""
|
150
|
+
for key in parameter.keys {
|
151
|
+
// 値の取り出し
|
152
|
+
guard let value = parameter[key] else {
|
153
|
+
// 値なし。次のfor文の処理を行なう
|
154
|
+
continue
|
155
|
+
}
|
156
|
+
|
157
|
+
// 既にパラメータが設定されていた場合
|
158
|
+
if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 {
|
159
|
+
// パラメータ同士のセパレータである&を追加する
|
160
|
+
parameterString += "&"
|
161
|
+
}
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
// 値をエンコードする
|
166
|
+
guard let encodeValue = encodeParameter(key: key, value: value) else {
|
167
|
+
// エンコード失敗。次のfor文の処理を行なう
|
168
|
+
continue
|
169
|
+
}
|
170
|
+
// エンコードした値をパラメータとして追加する
|
171
|
+
parameterString += encodeValue
|
172
|
+
|
173
|
+
}
|
174
|
+
let requestUrl = entryUrl + "?" + parameterString
|
175
|
+
return requestUrl
|
176
|
+
}
|
177
|
+
|
178
|
+
// 検索結果をパースして商品リストを作成する
|
179
|
+
func parseData(items: [Any], resultHandler: @escaping (([String]?) -> Void)) {
|
180
|
+
|
181
|
+
for item in items {
|
182
|
+
|
183
|
+
// レスポンスデータから画像の情報を取得する
|
184
|
+
guard let item = item as? [String: Any], let imageURL = item["link"] as? String else {
|
185
|
+
resultHandler(nil)
|
186
|
+
return
|
187
|
+
}
|
188
|
+
print(imageURL)
|
189
|
+
|
190
|
+
// 配列に追加
|
191
|
+
wordImageArray.append(imageURL)
|
192
|
+
}
|
193
|
+
|
194
|
+
resultHandler(wordImageArray)
|
195
|
+
dump(wordImageArray)
|
196
|
+
}
|
197
|
+
|
198
|
+
// リクエストを行なう
|
199
|
+
func request(requestUrl: String, resultHandler: @escaping (([String]?) -> Void)) {
|
200
|
+
// URL生成
|
201
|
+
guard let url = URL(string: requestUrl) else {
|
202
|
+
// URL生成失敗
|
203
|
+
resultHandler(nil)
|
204
|
+
return
|
205
|
+
}
|
206
|
+
|
207
|
+
// リクエスト生成
|
208
|
+
let request = URLRequest(url: url)
|
209
|
+
|
210
|
+
// APIをコールして商品検索を行なう
|
211
|
+
let session = URLSession.shared
|
212
|
+
let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in
|
213
|
+
// 通信完了後の処理
|
214
|
+
|
215
|
+
print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "")
|
216
|
+
|
217
|
+
// エラーチェック
|
218
|
+
guard error == nil else {
|
219
|
+
// エラー表示
|
220
|
+
let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
|
221
|
+
|
222
|
+
// UIに関する処理はメインスレッド上で行なう
|
223
|
+
DispatchQueue.main.async {
|
224
|
+
self.present(alert, animated: true, completion: nil)
|
225
|
+
}
|
226
|
+
resultHandler(nil)
|
227
|
+
return
|
228
|
+
}
|
229
|
+
|
230
|
+
// JSONで返却されたデータをパースして格納する
|
231
|
+
guard let data = data else {
|
232
|
+
// データなし
|
233
|
+
resultHandler(nil)
|
234
|
+
return
|
235
|
+
}
|
236
|
+
|
237
|
+
// JSON形式への変換処理
|
238
|
+
guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else {
|
239
|
+
// 変換失敗
|
240
|
+
resultHandler(nil)
|
241
|
+
return
|
242
|
+
}
|
243
|
+
|
244
|
+
// データを解析
|
245
|
+
guard let resultSet = jsonData["items"] as? [Any] else {
|
246
|
+
// データなし
|
247
|
+
resultHandler(nil)
|
248
|
+
return
|
249
|
+
}
|
250
|
+
self.parseData(items: resultSet, resultHandler: resultHandler)
|
251
|
+
}
|
252
|
+
// 通信開始
|
253
|
+
task.resume()
|
254
|
+
}
|
255
|
+
|
83
256
|
```
|
1
修正
answer
CHANGED
@@ -6,9 +6,9 @@
|
|
6
6
|
print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "")
|
7
7
|
```
|
8
8
|
|
9
|
-
以下のようにすることで画像の`URL`を配列に入れることができます。
|
9
|
+
変更した部分のみ載せますが、以下のようにすることで画像の`URL`を配列に入れることができます。
|
10
|
-
※ 変更した部分のみ載せます。
|
11
10
|
|
11
|
+
|
12
12
|
```swift
|
13
13
|
// 検索結果をパースして商品リストを作成する
|
14
14
|
func parseData(items: [Any]) {
|