Swift3 在Swift 3中传递函数
一种新语言的缺点之一是在不同的版本之间经常会有重大的变化。因此,你在网上找到的任何东西都很容易过时。或者可能不是,我只是没有正确地阅读 我试图在函数调用中传递函数。我可以让它在没有任何参数的情况下工作。我只是声明作为全局类传递的参数。在汇编程序方面的糟糕经历使我想避免可怕的全局错误。以下是我工作代码的相关部分:Swift3 在Swift 3中传递函数,swift3,closures,Swift3,Closures,一种新语言的缺点之一是在不同的版本之间经常会有重大的变化。因此,你在网上找到的任何东西都很容易过时。或者可能不是,我只是没有正确地阅读 我试图在函数调用中传递函数。我可以让它在没有任何参数的情况下工作。我只是声明作为全局类传递的参数。在汇编程序方面的糟糕经历使我想避免可怕的全局错误。以下是我工作代码的相关部分: class ViewController: NSViewController { var artistData: NSArray = [] override func
class ViewController: NSViewController {
var artistData: NSArray = []
override func viewDidLoad() {
/*1*/ getDataFromUrl(url: "http://catbox.loc/artists.json", loadFunction: loadArtistTable())
//getDataFromUrl(url: "http://catbox.loc/artists.json", loadFunction: loadArtistTable)
}
/*2*/func getDataFromUrl(url: String, loadFunction: ()) {
//func getDataFromUrl(url: String, loadFunction: (NSArray)) {
session.dataTask(with: request) { data, response, err in
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
self.artistData = json!
}
catch {
print(error)
}
/*3*/ loadFunction
//loadFunction(self.artistData)
}.resume()
}
/*4*/ func loadArtistTable() {
//func loadArtistTable(_ jsonData: NSArray) {
...
}
注释掉的代码是我试图编译它的众多排列之一。理想情况下,我希望从JSONSerialization调用传递“json”。最后一次尝试是基于苹果的闭包文档,他们给出了以下示例:
var reversedNames = names.sorted(by: backward)
我的回答
我接受了@Nirav D的答案,但我没有尝试。我的答案是基于他的密码。我决定坚持使用NSArray。这些数字与我在上面代码中添加的数字相对应
/*1*/ getDataFromUrl(url: "http://catbox.loc/records.json", loadFunction: loadArtistTable)
/*2*/ func getDataFromUrl(url: String, loadFunction: @escaping (NSArray) ->()) {
/*3*/ loadFunction(json)
/*4*/ func loadArtistTable(jsonData: NSArray) {
在3中,我直接使用JSONSerialization的输出,而不是将其复制到类变量
更新
我尝试了@Nirav D的方法,效果也很好。在Swift中使用Swift的原生
数组/字典
,而不是NSArray/NSDictionary
。您查看的方式称为completionHandler
,并在调用函数时将函数作为completionHandler
传递
因此,首先要这样做getDataFromUrl
func getDataFromUrl(url: String, loadFunction: @escaping ([[String: Any]]?) -> Void) {
session.dataTask(with: request) { data, response, err in
var array: [[String:Any]]? = nil
do {
if let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [[String: Any]] {
array = json
}
}
catch {
print(error)
}
loadFunction(array)
}.resume()
}
现在创建LoadArtistable
函数
func loadArtistTable(array: [[String: Any]]?) {
if let jsonArray = array {
print(array)
}
}
现在只需调用getDataFromUrl
并将LoadArtistable
函数作为它的第二个参数
self.getDataFromUrl(url: url, loadFunction: self.loadArtistTable)
注意:这里[[String:Any]]
是字典的数组,如果您收到数组字符串,而不是像这样创建[String]
字符串的数组