Swift 中闭包方法的返回值

Posted

技术标签:

【中文标题】Swift 中闭包方法的返回值【英文标题】:Return value for method from closure in Swift 【发布时间】:2015-06-09 16:52:17 【问题描述】:

有没有一种方法可以从我的闭包中返回 shouldPerformSegueWithIdentifier 方法的值?还是我应该换一种方式?

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool 

    getDataFromSomewhere()  succeeded, data in
        if succeeded 
            // Should return true here            
         else 
            self.errorAlert("Error", message: "Can't get data...")
            // Should return false here
        
    


【问题讨论】:

【参考方案1】:

您不能让shouldPerformSegueWithIdentifier:sender: 从您放置// Should return true here 的位置返回。你需要这样做:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool 
    var returnValue: Bool = false

    getDataFromSomewhere()  succeeded, data in
        if succeeded 
            returnValue = true
         else 
            self.errorAlert("Error", message: "Can't get data...")
            returnValue = false
        
    

    return returnValue

请注意,这仅在getDataFromSomewheregetDataFromSomewhere 返回之前执行闭包时才有效。如果getDataFromSomewhere 存储了闭包,并安排稍后调用它(例如,在异步网络请求之后),那么这将不起作用。它只会使 shouldPerformSegueWithIdentifier:sender: 返回您用于初始化 returnValue 的值。

【讨论】:

谢谢!很有帮助!【参考方案2】:

如果你的 getDataFromSomewhere 闭包是异步的,那么除了使用完成处理程序之外你没有其他解决方案。

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?, , completion: @escaping ((Bool) -> Void)) 
    getDataFromSomewhere()  succeeded, data in
        if succeeded 
            completion(true)
         else 
            self.errorAlert("Error", message: "Can't get data...")
            completion(false)
        
    

【讨论】:

shouldPerformSegueWithIdentifier 是一个覆盖,因此更改其签名将阻止系统调用它。 啊好吧我没注意到,谢谢。【参考方案3】:

你反对使用 prepareforsegue 和 unwind segue 吗?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    if segue.identifier == "fuelButtonUnhide"

        if let vc = segue.destinationViewController as? DateViewController 

            vc.fuelHidden = false
        
     


@IBAction func unwindDateViewToAddFuel(segue: UIStoryboardSegue)
    //Change any data from the date view here
    println("Hit done from date view")

您可以在 prepareforsegue 中传递数据并在 unwind 操作中检索数据。

【讨论】:

事实并非如此。我需要知道我能否从关闭中返回“方法返回”。

以上是关于Swift 中闭包方法的返回值的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从 Swift 中的 void 闭包中返回一个值?

Swift函数和闭包

Swift学习笔记:闭包

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

Swift语法之.map