Swift 我如何将这个JSON输出从;“做”;叫斯威夫特?
在过去的几个小时里,我一直在检索JSON的内容并将其放入数组中。现在我终于明白了,我不知道如何获取包含数组的变量“students”。我希望能够将此变量返回到viewDidLoad函数。你能帮忙吗Swift 我如何将这个JSON输出从;“做”;叫斯威夫特?,swift,xcode,codable,decodable,Swift,Xcode,Codable,Decodable,在过去的几个小时里,我一直在检索JSON的内容并将其放入数组中。现在我终于明白了,我不知道如何获取包含数组的变量“students”。我希望能够将此变量返回到viewDidLoad函数。你能帮忙吗 class ViewController: UIViewController { struct Student: Decodable { let Name: String? let Gender: String let SRT, RST, Accuracy: Double
class ViewController: UIViewController {
struct Student: Decodable {
let Name: String?
let Gender: String
let SRT, RST, Accuracy: Double
let AttentionLevel: Int
let FavoriteSubject, LeastFavoriteSubject: String
}
struct Student: Decodable {
let Name: String
let Score: Int
}
override func viewDidLoad() {
super.viewDidLoad()
getJSONFromOnline()
}
func getJSONFromOnline(){
let jsonURLString = "insert example URL String here" //(I'm using a GitHub Pages site to host the students' data)
let url = URL(string: jsonURLString)
URLSession.shared.dataTask(with: url!){
(data, response, err) in
guard let data = data else {return}
do {
let students = try JSONDecoder().decode([Student].self, from: data)
//How do I get this ^^^ variable back to the viewDidLoad function?
}
catch let jsonErr{
print("error serializing", jsonErr)
}
}.resume()
}
}
将
@escaping
完成块添加到getJSONFromOnline
方法中,并使用闭包块在viewDidLoad
中获取学生
class ViewController: UIViewController {
//...
override func viewDidLoad() {
super.viewDidLoad()
getJSONFromOnline { students in
print("got students", students)
}
}
func getJSONFromOnline(completion: @escaping ([Student]) -> Void) {
//...
let students = try JSONDecoder().decode([Student].self, from: data)
completion(students)
//...
}
}
附加:最好将方法命名得更具体一些,比如getStudents
或fetchStudents
。另外,将structStudent
声明移到ViewCotroller
之外,您是一个绝对的魔术师。这让我花了好几个小时,非常感谢。最后一点(对不起)-在视图的正下方加载了,当您打印“学生”的内容时,您如何将“学生”变量设置为全局变量?我的最终目标是使它在整个视图控制器中成为全局的,这样我就可以使用它来填充一些CollectionView。您可以在视图控制器中声明一个可选的成员变量。异步获取数据时,可以设置此变量的值。这样,加载后,它将可用于所有视图控制器代码。您需要将其保留为可选,因为它最初没有值