teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2016/12/31 10:20

投稿

_Kentarou
_Kentarou

スコア8490

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

修正

2016/12/31 10:20

投稿

_Kentarou
_Kentarou

スコア8490

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]) {