在Swift 3中追加函数范围之外的变量

时间:2017-07-16 22:01:51

标签: swift

我试图附加jsonFile,但是,我无法用新的NSString追加jsonFile,除非我在函数中使用了一个mutuable变量作为参数文件。我找到了使用“inout”的解决方案但在这种情况下我得到的错误是“scaping closures只能通过值file.append(jsonData)显式捕获inout参数

var jsonFile: [NSString] = []

func function(file: inout [NSString]){
    let request = NSMutableURLRequest(url: URL(string: "https://parse.udacity.com/parse/classes/StudentLocation?limit=1")!)
    request.addValue("QrX47CA9cyuGewLdsL7o5Eb8iug6Em8ye0dnAbIr", forHTTPHeaderField: "X-Parse-Application-Id")
    request.addValue("QuWThTdiRmTux3YaDseUSEpUKo7aBYM737yKd4gY", forHTTPHeaderField: "X-Parse-REST-API-Key")
    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest) { data, response, error in
        if error != nil { // Handle error...
            return
        }
        let jsonData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
        print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!)
        file.append(jsonData)
    }
    task.resume()
}

function(file: &jsonFile)

print(jsonFile)

1 个答案:

答案 0 :(得分:1)

您正在处理异步代码。您不应该使用inout参数。相反,您应该使用完成处理程序。

以下内容将起作用:

var jsonFile: [String] = []

func function(completion: @escaping (String?) -> Void) {
    var request = URLRequest(url: URL(string: "https://parse.udacity.com/parse/classes/StudentLocation?limit=1")!)
    request.addValue("QrX47CA9cyuGewLdsL7o5Eb8iug6Em8ye0dnAbIr", forHTTPHeaderField: "X-Parse-Application-Id")
    request.addValue("QuWThTdiRmTux3YaDseUSEpUKo7aBYM737yKd4gY", forHTTPHeaderField: "X-Parse-REST-API-Key")
    let session = URLSession.shared
    let task = session.dataTask(with: request) { data, response, error in
        if let data = data, error != nil {
            if let jsonData = String(data: data, encoding: .utf8) {
                completion(jsonData)
            } else {
                completion(nil)
            }
        } else {
            completion(nil)
        }
    }
    task.resume()
}

function() { (string) in
    if let string = string {
        jsonFile.append(string)
    }

    print(jsonFile)
}

注意所有其他的清理工作。请勿使用NSString,请使用String。请勿使用NSMutableURLRequest,将URLRequestvar一起使用。