2017-01-03 36 views
0

我在Swift3中遇到了以下代码的问题。我不知道我在做什么错,但是当我尝试打印'list'时,我收到编译器错误'Use of unresolved identifier'。任何人都可以指出我的正确方向吗?使用未解析的标识符 - 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'超出了范围(异步块)。无论如何,除了那个'list'将在那个时候是空的。 – vadian

+0

试着在'} catch {'之前打印列表,看看你得到了什么。 –

+0

@PhillipMills如果我之前打印清单} catch,那么我会得到一个正确的结果。但是,如何在do/catch子句之外使用List的数据表单?列表包含需要填充TableView的数据。我不知道如何从列表中获取数据到表格行中? – Luke

回答

0

我很惊讶你的代码甚至编译自list是不是在相同的范围内你print命令。编译器应该抓住这一点。

本质上,问题是在do块内定义了list。这意味着list的范围仅限于do区块。像@vadian在他的评论中说的,在guard声明之后并在包含} catch {的行之前执行print(list)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() 

另外请注意,因为你没有做任何UI更新(至少现在还不是)在这里,你不需要在主线程上执行该代码。你可以用这个代替:

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

} 
相关问题