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
}
请注意,这仅在 getDataFromSomewhere
在 getDataFromSomewhere
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)
}
}
}
有没有一种方法可以从闭包中为 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
}
请注意,这仅在 getDataFromSomewhere
在 getDataFromSomewhere
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)
}
}
}