Swift - 我如何在闭包之外返回数组值?

Posted

技术标签:

【中文标题】Swift - 我如何在闭包之外返回数组值?【英文标题】:Swift - How do i return the array value outside of the closure? 【发布时间】:2018-07-25 08:07:31 【问题描述】:

我的 swift 代码有问题。我正在尝试将数组 yearsLinks 设置为我的闭包内的一个值,并且当我仍在闭包中时我能够执行此操作并打印它但是当我尝试在闭包之外打印数组值时,它返回一个空数组.这是为什么?

请帮忙,我想设置数组值,yearLinks 到表格视图中的单元格。

这是我的代码的 sn-p。感谢帮助。非常感谢:)

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 

var url = String()
var yearsLinks = [String]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return yearsLinks.count


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
    cell.textLabel?.text = yearsLinks[indexPath.row]
    return cell


override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    if let requests = URL(string: url)
        let request = NSURLRequest(url: requests)
        let task = URLSession.shared.dataTask(with: request as URLRequest)
            data, response, error in
            if error != nil 
                print(error as Any)
             else 
                if let unwrappedData = data 
                    let wrappedData = NSString(data: unwrappedData, encoding: String.Encoding.utf8.rawValue)

                              ...
              //  THESE ARE JUST CODE TO GRAB THE ARRAY THAT I WANT
              //  linkyears IS AN ARRAY OF VALUES DECLARED IN THE CLOSURE THAT I WANT TO SET TO THE yearsLinks VARIABLE DECLARED OUTSIDE.          
                        self.yearsLinks = linkyears
                              ...

                        print(self.yearsLinks) // THIS WORKS FINE AND RETURNS AN ARRAY OF VALUES THAT I WANTED.
                    
                
            

        
        // TRYING TO ACCESS THE ARRAY OF VALUES IN THE yearsLinks ARRAY RETURNS AN EMPTY STRING??

        task.resume()

    

【问题讨论】:

"在闭包之外,它返回一个空数组。这是为什么?"因为您缺少的概念是 Asynchrone。例如,添加带有“id”的打印,例如print("InsideClosure: \(self.yearLinks)")print("AfterClosure: \(self.yearLinks)"),看看哪个是之前/之后的打印,它不是你想的那个。在闭包中,一旦你执行了self.yearLinks = ...,就执行tableView.reloadData()(并在主线程中执行)。 @Larme 感谢您的帮助,但我尝试使用 DispatchQueue.main.async 但它不起作用。如果我希望能够链接 yearLinks 数组中的值以在表格视图单元格方法中呈现,您能否指导我如何编写代码?? 【参考方案1】:

它返回空的原因是打印函数甚至在 URL 会话之前就被调用了。不仅如此,urlSession 需要一段时间才能到达回调。

如果需要使用数组,可以在闭包中放一个以数组为参数的函数。

【讨论】:

嗨,詹姆斯,谢谢您的回复,我知道闭包与外部代码同时运行,因此当我尝试在外部打印它时它还没有任何值关闭。但是如何在闭包之外获取 yearLinks 数组中的值,因为我需要将它们显示在 Tableview 单元格方法中?我究竟如何创建一个将数组作为闭包中的参数的函数???非常感谢您的帮助:)【参考方案2】:

你是如何在闭包之外打印数组值的?这个闭包是异步的。如果要打印数组,可以重新加载tableView,然后在UITableViewDelegate中打印。

【讨论】:

以上是关于Swift - 我如何在闭包之外返回数组值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 的闭包中接收方法的输出?

求助关于 swift 数组,NSArray 和 闭包 的问题

将值从闭包赋值给变量 Swift

从包含闭包的 Swift 函数返回值

Swift 中闭包方法的返回值

PromiseKit ios Swift 闭包返回类型问题