完成块 return 无

Completion blocks return nothing

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {

        isSuccess(true, success: { (name) -> String in
            return "My name is \(name)"
        })

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }


    func isSuccess(val:Bool, success: (name: String) -> String) {
        if val {
            success(name: "Jacky")
        }
    }

}

我希望它是 return 字符串 "My name is Jacky",但它没有。但是如果我将 isSuccess 更改为 :

    func isSuccess(val:Bool, success: (name: String) -> String) {
        if val {
            print(success(name: "Jacky"))
        }
    }

}

然后就正常了,为什么呢?提前致谢!

您的完成块 returns 一个字符串。 当您通过调用

调用它时
success(name: "Jacky")

完成块 returns String 我叫 Jacky。但是你对那个字符串什么都不做。你只是把它退了,从来没有用过它。 在你的第二个例子中,你实际使用了它——你从完成块中取出了字符串,并打印了它。

例如,您也可以这样写

let stringFromCompletionBlock = success(name: "Jacky")

这样你可以看到它确实返回了一个值。


另一件事是完成块应该作为函数中的最后一件事来调用 - 这样你 "notify" 函数已经完成了它的目的,所以使用从返回的值是不合理的调用该完成块的同一函数内的完成块

首先函数isSuccess中的闭包应该这样声明。闭包不应该 return 一个 String,它应该只接受一个 String 作为参数。

func isSuccess(val:Bool, success: (name: String) -> ()) {
    if val {
        success(name: "Jacky")
    }
}

接下来您可以使用该值来更新 UI,如下所示

class ViewController: UIViewController {

    weak var label:UILabel!

    override func viewDidLoad() {

        isSuccess(true) { (name) -> () in
            dispatch_async(dispatch_get_main_queue()) {
                self.label.text = "My name is \(name)"
            }
        }            
        super.viewDidLoad()
    }

    func isSuccess(val:Bool, success: (name: String) -> ()) {
        if val {
            success(name: "Jacky")
        }
    }   
}