我试图附加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)
答案 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
,将URLRequest
与var
一起使用。