在 Swift 3 中附加一个函数范围之外的变量

Posted

技术标签:

【中文标题】在 Swift 3 中附加一个函数范围之外的变量【英文标题】:Appending a variable outside the scope of a function in Swift 3 【发布时间】:2017-07-16 22:01:51 【问题描述】:

我正在尝试附加 jsonFile,但是,除非我对函数中的参数文件使用可变变量,否则我无法将新的 NSString 附加到 jsonFile。我找到了使用“inout”的解决方案,但在这种情况下,我得到了“scaping 闭包只能通过值 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】:

您正在处理异步代码。您不应使用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

【讨论】:

以上是关于在 Swift 3 中附加一个函数范围之外的变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言extern关键字用法详解

函数的副作用 —— 纯函数的理解

我正在尝试将地理位置存储在函数范围之外的一些变量中,js [重复]

Javascript,回调函数中的变量范围之外?

声明(Declarative)式与命令(Imperative)式

Swift-使用完成处理程序更新闭包外的全局变量