Swift 我如何将这个JSON输出从;“做”;叫斯威夫特?

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

在过去的几个小时里,我一直在检索JSON的内容并将其放入数组中。现在我终于明白了,我不知道如何获取包含数组的变量“students”。我希望能够将此变量返回到viewDidLoad函数。你能帮忙吗

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
。另外,将struct
Student
声明移到
ViewCotroller

之外,您是一个绝对的魔术师。这让我花了好几个小时,非常感谢。最后一点(对不起)-在视图的正下方加载了,当您打印“学生”的内容时,您如何将“学生”变量设置为全局变量?我的最终目标是使它在整个视图控制器中成为全局的,这样我就可以使用它来填充一些CollectionView。您可以在视图控制器中声明一个可选的成员变量。异步获取数据时,可以设置此变量的值。这样,加载后,它将可用于所有视图控制器代码。您需要将其保留为可选,因为它最初没有值