Return Swift 中闭包的方法值

Return value for method from closure in Swift

有没有一种方法可以从闭包中为 shouldPerformSegueWithIdentifier 方法 return 赋值?还是我应该换一种方式?

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
        }
    }

}

您反对使用 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 中传递数据并在展开操作中检索数据。

你不能从你放// Should return true here的地方变成shouldPerformSegueWithIdentifier:sender:return。您需要改为执行以下操作:

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 return 之前执行闭包时才有效。如果 getDataFromSomewhere 存储闭包,并安排稍后调用它(例如,在异步网络请求之后),那么这将不起作用。它只会使 shouldPerformSegueWithIdentifier:sender: return 成为您用来初始化 returnValue.

的值

如果你的 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)
        }
    }
}