2017-01-03 2 views
0

Swift3에서 다음 코드에 문제가 있습니다. 내가 뭘 잘못하고 있는지 잘 모르겠지만 '목록'을 인쇄하려고하면 컴파일러 오류 '사용되지 않은 식별자 사용'이 나타납니다. 아무도 내게 올바른 방향을 가리킬 수 있습니까? 난미해결 식별자 사용 - Swift 3

let task = URLSession.shared.dataTask(with: request) { data, response, error in 

DispatchQueue.main.async { 

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { 

     do { 

     let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] 

     guard let list = json?["response"] as? [[String : Any]] else { 
          return 
         } 
     } catch { 
      print("catch error...") 
      } 

    } //end of if let httpStatus 

}//end dispacth 

}//end of task 

task.resume() 

print(list) 
+1

'list'는 범위 밖입니다 (async 블록). 그 '목록'을 제외하고 그 순간에 어쨌든 비어있을 것입니다. – vadian

+0

'} catch {'의 직전에 인쇄 목록을 시험해보고 얻은 것을보십시오. –

+0

@PhillipMills 전에 목록을 인쇄하면 catch하십시오. 그러면 적절한 결과가 나옵니다. 그러나 do/catch 절 외부의 목록에서 데이터 형식을 사용하려면 어떻게해야합니까? 목록에는 TableView를 채워야하는 데이터가 포함됩니다. 어떻게 목록에서 테이블 행으로 데이터를 가져올 수 있는지 잘 모르겠습니다. – Luke

답변

0

listprint 명령과 동일한 범위에 포함되지 때문에 코드도 컴파일 놀라게했다. 컴파일러가이를 잡아야합니다.

기본적으로 listdo 블록 내에 정의되어 있습니다. 즉, list의 범위는 do 블록으로 제한됩니다. @ vadian이 그의 의견에서 말했다면 guard 진술 후 } catch {이 포함 된 줄 앞에 print(list)을 실행하십시오. list은 그 범위에 있으며 그 값이 nil이 아닌 한 json?["response"] as? [[String : Any]]의 값을 갖습니다.이 경우 guard 블록이 실행되어 Dispatch.main.async 블록에서 반환됩니다.

새로운 코드 :

let task = URLSession.shared.dataTask(with: request) { data, response, error in 

DispatchQueue.main.async { 

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 200 { 

     do { 

     let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any] 

     guard let list = json?["response"] as? [[String : Any]] else { 
      print("list variable is nil") 
      return 
     } 

     print(list) 

     } catch { 
      print("catch error...") 
     } 

    } //end of if let httpStatus 

}//end dispacth 

}//end of task 

task.resume() 

또한, 당신이 어떤 UI 업데이트를 수행하지 않는 때문에 (적어도 아직) 여기, 당신은 주 스레드에서이 코드를 실행하지 않아도됩니다. 다음과 같이 대신 사용할 수 있습니다 :

DispatchQueue.global(attributes: .qosDefault).async { 

} 
관련 문제