배열 (arr
)을 (async 호출을 사용하여) 반환하고 싶습니다. 메서드에서 completionHandler
을 구현하지만 배열을 가져 오는 데 내 메서드를 사용할 수 없습니다. Cast from '(@escaping ((Array<Any>) -> Void)) ->()' to unrelated type '[[String : Any]]' always fails
CompletionHandler와 Swift에서 비동기 호출 3
어떻게 해결할 수 있습니까? 여기
내 코드입니다 :func dataWithURL(completion: @escaping ((_ result:Array<Any>) -> Void)) {
let urlString = "https://api.unsplash.com/photos/?client_id=71ad401443f49f22556bb6a31c09d62429323491356d2e829b23f8958fd108c4"
let url = URL(string: urlString)!
let urlRequest = URLRequest(url: url)
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
var arr = [[String:String]]()
let task = session.dataTask(with: urlRequest, completionHandler: { (data, response, error) in
// do stuff with response, data & error here
if let statusesArray = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [[String: Any]] {
for item in statusesArray! {
let photos = item["urls"] as? [String: Any]
let photo = photos?["small"] as? String
let myDictionary = [
"name": "test",
"imageURL": photo]
arr.append(myDictionary as! [String : String])
}
print(arr)
completion(arr)
}
})
task.resume()
}
그리고 내 배열을 취득하고자 할 때 :
lazy var photos: [Photo] = {
var photos = [Photo]()
// HERE THE ERROR APPEARS
guard let data = self.dataWithURL as? [[String: Any]] else { return photos }
for info in data {
let photo = Photo(info: info)
photos.append(photo)
}
return photos
}()
함수를 호출하는 방법, 클로저를 사용하는 방법, 클로저를 먼저 완료 블록으로 사용하는 방법을 검색해야한다고 생각합니다. –