完成块不返回任何内容
Posted
技术标签:
【中文标题】完成块不返回任何内容【英文标题】: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 我不熟悉完成处理程序,你能详细描述一下吗?谢谢 【参考方案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")
【讨论】:
以上是关于完成块不返回任何内容的主要内容,如果未能解决你的问题,请参考以下文章