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
请注意,这仅在getDataFromSomewhere
在getDataFromSomewhere
返回之前执行闭包时才有效。如果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 中闭包方法的返回值的主要内容,如果未能解决你的问题,请参考以下文章