完成块不返回任何内容

时间:2016-02-24 11:11:24

标签: swift completion-block

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")
        }
    }

}

我希望它返回字符串“我的名字是Jacky”,但它没有。但是如果我将isSuccess更改为:

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

}

然后它运作正常,为什么?提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

完成块返回String我的名字是Jacky。但你对那个字符串什么都不做。你刚刚退回它并且从未使用它。 在你的第二个例子中,你实际上使用了它 - 你从完成块中取出了字符串并打印出来。

例如,相反打印,你也可以写

let stringFromCompletionBlock = success(name: "Jacky")

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

另一件事是完成块应该被调用作为函数中的最后一件事 - 这样你“通知”函数已经完成了它的目的,所以使用从里面的完成块返回的值是不合理的调用完成块的相同函数

答案 1 :(得分:0)

首先,函数isSuccess中的闭包应该以这种方式声明。闭包不应该返回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")
        }
    }   
}