【问题标题】:Completion blocks return nothing完成块不返回任何内容
【发布时间】:2016-02-24 11:11:24
【问题描述】:
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"))
        }
    }

}

然后它正常工作,这是为什么呢?提前致谢!

【问题讨论】:

  • 你如何测试它返回的内容?你没有在任何地方捕捉它
  • @Wain 我不熟悉完成处理程序,你能详细描述一下吗?谢谢

标签: swift completion-block


【解决方案1】:

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

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

完成块返回字符串 My name is Jacky。但是你对那个字符串什么也不做。你只是退回它,从未使用过它。 在您的第二个示例中,您实际使用了它 - 您从完成块中获取字符串,并打印它。

例如,代替打印,你也可以写

let stringFromCompletionBlock = success(name: "Jacky")

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


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

【讨论】:

  • 我尝试用 let 替换 print ,但它实际上不会返回任何东西。
【解决方案2】:

首先,函数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")
        }
    }   
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2020-04-27
    • 2019-04-06
    • 2012-02-15
    相关资源
    最近更新 更多