###前提・実現したいこと
iOSアプリにて、wordImageという名前でOutlet接続したUIImageViewにGoogle Custom Searchエンジンを使用した検索結果の画像を表示したい。
wordImageArrayという名前のString配列に画像URLを格納し、ViewDidLoadでwordImageArray[0]を表示し、フリックで[1],[2],と次々に表示していこうと考えています。
###発生している問題・エラーメッセージ
うまくパースできない。
エラーメッセージ
格納したはずのwordImageArrayが空っぽ
###該当のソースコード
Swift
1 2import UIKit 3 4class SearchViewController: UIViewController { 5 6 @IBOutlet weak var searchLabel: UILabel! 7 @IBOutlet weak var wordImage: UIImageView! 8 9 //関連画像URLを格納する配列 10 var wordImageArray: [String] = [String]() 11 12 // APIを利用するためのアプリケーションID 13 let apikey: String = "??" 14 // let appid: String = "発行したアプリケーションIDをここに設定してください" 15 16 //APIを利用するためのサーチエンジンキー 17 let cx: String = "????" 18 19 //利用するAPIのサーチタイプ 20 let searchType: String = "image" 21 22 // APIのURL 23 let entryUrl: String = "https://www.googleapis.com/customsearch/v1" 24 25 var resultconfirm: String = "0" 26 27 override func viewDidLoad() { 28 super.viewDidLoad() 29 let pasteboard = UIPasteboard.general 30 let copiedText = pasteboard.string 31 searchLabel.text = copiedText 32 // Do any additional setup after loading the view. 33 34 35 // パラメータを指定する 36 let parameter = ["key": apikey,"cx":cx,"searchType":searchType,"q":copiedText] 37 38 39 // パラメータをエンコードしたURLを作成する 40 let requestUrl = createRequestUrl(parameter: parameter as! [String : String]) 41 42 print("リクエストURLは"+requestUrl) 43 44 // APIをリクエストする 45 request(requestUrl: requestUrl) 46 47 48// if let url = URL(string: wordImageArray[0]) { 49// let req = URLRequest(url: url) 50// let task = URLSession.shared.dataTask(with: req, completionHandler: {data, response, error in 51// if let data = data { 52// if let anImage = UIImage(data: data) { 53// DispatchQueue.main.async { 54// self.wordImage.image = anImage 55// } 56// } 57// } 58// }) 59// task.resume() 60// } 61 print(wordImageArray) 62 63 } 64 65 override func didReceiveMemoryWarning() { 66 super.didReceiveMemoryWarning() 67 // Dispose of any resources that can be recreated. 68 } 69 70 // パラメータのURLエンコード処理 71 func encodeParameter(key: String, value: String) -> String? { 72 // 値をエンコードする 73 guard let escapedValue = value.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else { 74 // エンコード失敗 75 return nil 76 } 77 // エンコードした値をkey=valueの形式で返却する 78 return "\(key)=\(escapedValue)" 79 } 80 81 // URL作成処理 82 func createRequestUrl(parameter: [String: String]) -> String { 83 var parameterString = "" 84 for key in parameter.keys { 85 // 値の取り出し 86 guard let value = parameter[key] else { 87 // 値なし。次のfor文の処理を行なう 88 continue 89 } 90 91 // 既にパラメータが設定されていた場合 92 if parameterString.lengthOfBytes(using: String.Encoding.utf8) > 0 { 93 // パラメータ同士のセパレータである&を追加する 94 parameterString += "&" 95 } 96 97 98 99 // 値をエンコードする 100 guard let encodeValue = encodeParameter(key: key, value: value) else { 101 // エンコード失敗。次のfor文の処理を行なう 102 continue 103 } 104 // エンコードした値をパラメータとして追加する 105 parameterString += encodeValue 106 107 } 108 let requestUrl = entryUrl + "?" + parameterString 109 return requestUrl 110 } 111 112 // 検索結果をパースして商品リストを作成する 113 func parseData(resultSet: [String: Any]) { 114 115 print(resultSet) 116 for key in resultSet.keys.sorted() { 117 // 関連画像取得 118 guard let result = resultSet[key] as? [String: Any] else { 119 // 次のfor文の処理を行なう 120 continue 121 } 122 print(result) 123 124 // レスポンスデータから画像の情報を取得する 125 let itemImageUrl = result["link"] as? String 126 127 // 配列に追加 128 wordImageArray.append(itemImageUrl!) 129 } 130 } 131 132 // リクエストを行なう 133 func request(requestUrl: String) { 134 // URL生成 135 guard let url = URL(string: requestUrl) else { 136 // URL生成失敗 137 return 138 } 139 140 // リクエスト生成 141 let request = URLRequest(url: url) 142 143 // APIをコールして商品検索を行なう 144 let session = URLSession.shared 145 let task = session.dataTask(with: request) { (data:Data?, response:URLResponse?, error:Error?) in 146 // 通信完了後の処理 147 // エラーチェック 148 guard error == nil else { 149 // エラー表示 150 let alert = UIAlertController(title: "エラー", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert) 151 152 // UIに関する処理はメインスレッド上で行なう 153 DispatchQueue.main.async { 154 self.present(alert, animated: true, completion: nil) 155 } 156 return 157 } 158 159 // JSONで返却されたデータをパースして格納する 160 guard let data = data else { 161 // データなし 162 return 163 } 164 165 // JSON形式への変換処理 166 guard let jsonData = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: Any] else { 167 // 変換失敗 168 return 169 } 170 171 // データを解析 172 guard let resultSet = jsonData["items"] as? [String: Any] else { 173 // データなし 174 return 175 } 176 self.parseData(resultSet: resultSet) 177 } 178 // 通信開始 179 task.resume() 180 } 181 182} 183
###補足情報(言語/FW/ツール等のバージョンなど)
サーチエンジンキーとアプリケーションIDはすぐ実行できるように書いたままにしてありますが、悪用しないでください!!!><
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/30 09:21
2016/12/30 12:10
2016/12/31 09:06
2016/12/31 09:15
2016/12/31 09:27
2016/12/31 09:47
2016/12/31 10:22
2017/01/04 06:52