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]
字符串的数组