2016-11-24 3 views
-1

배열 (arr)을 (async 호출을 사용하여) 반환하고 싶습니다. 메서드에서 completionHandler을 구현하지만 배열을 가져 오는 데 내 메서드를 사용할 수 없습니다. Cast from '(@escaping ((Array<Any>) -> Void)) ->()' to unrelated type '[[String : Any]]' always failsCompletionHandler와 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 
}() 
+1

함수를 호출하는 방법, 클로저를 사용하는 방법, 클로저를 먼저 완료 블록으로 사용하는 방법을 검색해야한다고 생각합니다. –

답변

4

dataWithURL 콜백 (완료 핸들러)에 걸리는 따라서 만에 결과를 액세스 할 수 있습니다 콜백.

self.dataWithURL { result in 
//do stuff with the result 
} 

그러나 위의 코드의 문제는 당신이 그것을하지 않는 결과를 반환 dataWithURL를 기대하고 있다는 것입니다. void를 반환합니다.

또 다른 문제는 속성에 대해 dataWithURL의 결과를 사용하려고한다는 것입니다. 호출 photos에 액세스하는 호출은 dataWithURL 호출이 async (즉시 반환)이기 때문에 결과를 반환하지 않습니다 (최소한 첫 번째 호출시).

1

어제 this 질문을 한 xcode_Dev 인 것으로 보입니다. 당신은 함수 (또는 계산 된 변수)에서 무언가를 반환 할 수

이 여전히 사실이다 비동기 작업

을 포함

나는 그 질문에 댓글을 쓰셨습니다.

dataWithURL은 비동기 함수이므로 아무 것도 반환하지 않지만 반환 할 때 호출되는 closure를 전달해야합니다.

모든

첫째, 배열 [[String:String]] (문자열 키와 문자열 값으로 사전의 배열) 분명히 그래서 그것은 단지 유형을 지정 스위프트 3에서 훨씬 더 지정되지 않은 유형을 [Any]

func dataWithURL(completion: @escaping ([[String:String]]) -> Void) { 

를 사용하는 아주 바보 밑줄과 매개 변수 레이블이없는 선언에서. 다시 한번

dataWithURL { result in 
    for item in result { // the compiler knows the type 
     print(item["name"], item["imageURL"]) 
    } 
} 

:


당신은 기능이 방법을 호출해야 dataWithURL의 더 리턴 값이 없다. 클로저는 나중에 호출됩니다.