具有完成处理程序和返回的Swift功能
如何使Swift函数返回一个值,同时具有一个完成处理程序?其思想是函数首先返回一个临时结果,然后返回最终结果。比如:具有完成处理程序和返回的Swift功能,swift,Swift,如何使Swift函数返回一个值,同时具有一个完成处理程序?其思想是函数首先返回一个临时结果,然后返回最终结果。比如: func method(completion: (Int) -> ()) { return 2 ... some processing ... completion(3) } let a:Int = method(completion: { (new) -> Void in a = new }) 你把它弄颠倒了。您必须对中间结果使用完成
func method(completion: (Int) -> ()) {
return 2
... some processing ...
completion(3)
}
let a:Int = method(completion: { (new) -> Void in
a = new
})
你把它弄颠倒了。您必须对中间结果使用完成处理程序,对最终结果使用返回处理程序。调用return后,控件将退出函数
func method(completion: (Int) -> ()) -> Int {
completion(1)
//
//
completion(2)
//
//
return 3
}
然后像这样处理结果
let a: Int = method(completion: { (new) -> Void in
print(new)
})
print(a)
foo(completion: { (provisionalValue) in
// Handle provisional value
}) { (finalValue) in
// Handle final value
}
或
改为使用两个完成处理程序
您可以这样调用它并处理中间结果和最终结果
let a: Int = method(completion: { (new) -> Void in
print(new)
})
print(a)
foo(completion: { (provisionalValue) in
// Handle provisional value
}) { (finalValue) in
// Handle final value
}
第二种方法更灵活,但有时也会令人困惑。你必须小心,只有在达到最终结果时才调用最终完成。或者你可以在每一场决赛后加上一份回报。但是,你必须再次确保你的最终结果已经达到。你很接近了。您需要启动一些后台进程(完成处理程序的整个点),然后执行
返回操作
func method(completion: @escaping (Int) -> ()) -> Int {
DispatchQueue.global().async {
var x = 0
for y in 0...10_000 {
x += y
}
completion(3)
}
return 2
}
var aRes = 0
aRes = method(completion: { (new) -> Void in
aRes = new
print("2", aRes)
})
print("1", aRes)
这将导致:
1.22 3 延迟后出现第二行 请注意,您不能执行以下操作:
var aRes = method(completion: { (new) -> Void in
aRes = new
print("2", aRes)
})
这将导致错误“变量在其自身初始值内使用”。函数返回后,即完成。完成不能返回任何内容,它们只能运行。你想做什么?请发一个你想做什么的例子。是否应该将完成设置为变量a?您发布的代码引发的问题多于它的答案