2017-01-03 5 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' не входит в сферу действия (блок асинхронности). Кроме того, этот «список» в этот момент был бы пуст. – vadian

+0

Попробуйте распечатать список непосредственно перед '} catch {' и посмотреть, что вы получаете. –

+0

@PhillipMills Если я распечатаю список до} catch, тогда получаю правильный результат. Однако как я могу работать с данными из списка вне предложения do/catch? Список включает данные, которые необходимо будет заполнить TableView. Я не уверен, как я могу получить данные из списка в строки таблицы? – Luke

ответ

0

Я удивлен ваш код даже компилируется, так как list не в том же объеме, как и вашей команды print. Компилятор должен поймать это.

По существу, проблема заключается в том, что list определен внутри блока do. Это означает, что область действия list ограничивается только блоком do. Как @vadian сказал в своем комментарии, выполните print(list) после вашего заявления guard и перед строкой, содержащей } catch {. list будет находиться в области действия и имеет значение json?["response"] as? [[String : Any]], если это значение не равно nil (в этом случае блок 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() 

Кроме того, обратите внимание, что, так как вы не делаете никаких обновлений пользовательского интерфейса (по крайней мере, пока) здесь, вам не нужно выполнять этот код в основном потоке. Вместо этого вы можете использовать это:

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

} 
Смежные вопросы