回答編集履歴

2

修正

2016/12/31 10:20

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -163,3 +163,349 @@
163
163
  }
164
164
 
165
165
  ```
166
+
167
+
168
+
169
+ 回答追記
170
+
171
+ ---
172
+
173
+
174
+
175
+ ```swift
176
+
177
+
178
+
179
+ override func viewDidLoad() {
180
+
181
+ super.viewDidLoad()
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+ let pasteboard = UIPasteboard.general
190
+
191
+ var copiedText = pasteboard.string
192
+
193
+ searchLabel.text = copiedText
194
+
195
+ // Do any additional setup after loading the view.
196
+
197
+
198
+
199
+ copiedText = "dog"
200
+
201
+
202
+
203
+ // パラメータを指定する
204
+
205
+ let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":copiedText]
206
+
207
+ dump(parameter)
208
+
209
+
210
+
211
+ // パラメータをエンコードしたURLを作成する
212
+
213
+ let requestUrl = createRequestUrl(parameter: parameter as! [String : String])
214
+
215
+
216
+
217
+ print("リクエストURLは"+requestUrl)
218
+
219
+
220
+
221
+ // APIをリクエストする
222
+
223
+ request(requestUrl: requestUrl) { result in
224
+
225
+
226
+
227
+ dump(result)
228
+
229
+ if let url = URL(string: self.wordImageArray[0]) {
230
+
231
+ let req = URLRequest(url: url)
232
+
233
+ let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in
234
+
235
+ if let data = data {
236
+
237
+ if let anImage = UIImage(data: data) {
238
+
239
+ DispatchQueue.main.async {
240
+
241
+ self.wordImage.image = anImage
242
+
243
+ }
244
+
245
+ }
246
+
247
+ }
248
+
249
+ })
250
+
251
+ task.resume()
252
+
253
+ }
254
+
255
+ }
256
+
257
+ }
258
+
259
+
260
+
261
+ override func didReceiveMemoryWarning() {
262
+
263
+ super.didReceiveMemoryWarning()
264
+
265
+ // Dispose of any resources that can be recreated.
266
+
267
+ }
268
+
269
+
270
+
271
+ // パラメータのURLエンコード処理
272
+
273
+ func encodeParameter(key: String, value: String) -> String? {
274
+
275
+ // 値をエンコードする
276
+
277
+ guard let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else {
278
+
279
+ // エンコード失敗
280
+
281
+ return nil
282
+
283
+ }
284
+
285
+ // エンコードした値をkey=valueの形式で返却する
286
+
287
+ return "\(key)=\(escapedValue)"
288
+
289
+ }
290
+
291
+
292
+
293
+ // URL作成処理
294
+
295
+ func createRequestUrl(parameter: [String: String]) -> String {
296
+
297
+ var parameterString = ""
298
+
299
+ for key in parameter.keys {
300
+
301
+ // 値の取り出し
302
+
303
+ guard let value = parameter[key] else {
304
+
305
+ // 値なし。次のfor文の処理を行なう
306
+
307
+ continue
308
+
309
+ }
310
+
311
+
312
+
313
+ // 既にパラメータが設定されていた場合
314
+
315
+ if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 {
316
+
317
+ // パラメータ同士のセパレータである&を追加する
318
+
319
+ parameterString += "&"
320
+
321
+ }
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+ // 値をエンコードする
330
+
331
+ guard let encodeValue = encodeParameter(key: key, value: value) else {
332
+
333
+ // エンコード失敗。次のfor文の処理を行なう
334
+
335
+ continue
336
+
337
+ }
338
+
339
+ // エンコードした値をパラメータとして追加する
340
+
341
+ parameterString += encodeValue
342
+
343
+
344
+
345
+ }
346
+
347
+ let requestUrl = entryUrl + "?" + parameterString
348
+
349
+ return requestUrl
350
+
351
+ }
352
+
353
+
354
+
355
+ // 検索結果をパースして商品リストを作成する
356
+
357
+ func parseData(items: [Any], resultHandler: @escaping (([String]?) -> Void)) {
358
+
359
+
360
+
361
+ for item in items {
362
+
363
+
364
+
365
+ // レスポンスデータから画像の情報を取得する
366
+
367
+ guard let item = item as? [String: Any], let imageURL = item["link"] as? String else {
368
+
369
+ resultHandler(nil)
370
+
371
+ return
372
+
373
+ }
374
+
375
+ print(imageURL)
376
+
377
+
378
+
379
+ // 配列に追加
380
+
381
+ wordImageArray.append(imageURL)
382
+
383
+ }
384
+
385
+
386
+
387
+ resultHandler(wordImageArray)
388
+
389
+ dump(wordImageArray)
390
+
391
+ }
392
+
393
+
394
+
395
+ // リクエストを行なう
396
+
397
+ func request(requestUrl: String, resultHandler: @escaping (([String]?) -> Void)) {
398
+
399
+ // URL生成
400
+
401
+ guard let url = URL(string: requestUrl) else {
402
+
403
+ // URL生成失敗
404
+
405
+ resultHandler(nil)
406
+
407
+ return
408
+
409
+ }
410
+
411
+
412
+
413
+ // リクエスト生成
414
+
415
+ let request = URLRequest(url: url)
416
+
417
+
418
+
419
+ // APIをコールして商品検索を行なう
420
+
421
+ let session = URLSession.shared
422
+
423
+ let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in
424
+
425
+ // 通信完了後の処理
426
+
427
+
428
+
429
+ print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue) ?? "")
430
+
431
+
432
+
433
+ // エラーチェック
434
+
435
+ guard error == nil else {
436
+
437
+ // エラー表示
438
+
439
+ let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
440
+
441
+
442
+
443
+ // UIに関する処理はメインスレッド上で行なう
444
+
445
+ DispatchQueue.main.async {
446
+
447
+ self.present(alert, animated: true, completion: nil)
448
+
449
+ }
450
+
451
+ resultHandler(nil)
452
+
453
+ return
454
+
455
+ }
456
+
457
+
458
+
459
+ // JSONで返却されたデータをパースして格納する
460
+
461
+ guard let data = data else {
462
+
463
+ // データなし
464
+
465
+ resultHandler(nil)
466
+
467
+ return
468
+
469
+ }
470
+
471
+
472
+
473
+ // JSON形式への変換処理
474
+
475
+ guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else {
476
+
477
+ // 変換失敗
478
+
479
+ resultHandler(nil)
480
+
481
+ return
482
+
483
+ }
484
+
485
+
486
+
487
+ // データを解析
488
+
489
+ guard let resultSet = jsonData["items"] as? [Any] else {
490
+
491
+ // データなし
492
+
493
+ resultHandler(nil)
494
+
495
+ return
496
+
497
+ }
498
+
499
+ self.parseData(items: resultSet, resultHandler: resultHandler)
500
+
501
+ }
502
+
503
+ // 通信開始
504
+
505
+ task.resume()
506
+
507
+ }
508
+
509
+
510
+
511
+ ```

1

修正

2016/12/31 10:20

投稿

_Kentarou
_Kentarou

スコア8490

test CHANGED
@@ -14,9 +14,9 @@
14
14
 
15
15
 
16
16
 
17
- 以下のようにすることで画像の`URL`を配列に入れることができます。
17
+ 変更した部分のみ載せますが、以下のようにすることで画像の`URL`を配列に入れることができます。
18
18
 
19
- ※ 変更した部分のみ載せます。
19
+
20
20
 
21
21
 
22
22