具有完成处理程序和返回的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 }) 你把它弄颠倒了。您必须对中间结果使用完成

如何使Swift函数返回一个值,同时具有一个完成处理程序?其思想是函数首先返回一个临时结果,然后返回最终结果。比如:

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.2
2 3

延迟后出现第二行

请注意,您不能执行以下操作:

var aRes = method(completion: { (new) -> Void in
    aRes = new
    print("2", aRes)
})

这将导致错误“变量在其自身初始值内使用”。

函数返回后,即完成。完成不能返回任何内容,它们只能运行。你想做什么?请发一个你想做什么的例子。是否应该将完成设置为变量a?您发布的代码引发的问题多于它的答案