在Swift中为函数创建完成回调

如果您问我:什么是“完成”? 我会回答这个问题:在我看来,完成就像每顿饭中的甜点,它们不是必不可少的,但它们仅在您完成主菜时才使用。 请记住,补全仅在函数的末尾运行。


我们看到完成的最常见的地方是下面的两个坏男孩。

  dismiss(动画:Bool,完成:(()-> Void)?)present(viewControllerToPresent:UIViewController,动画:Bool,完成:(()-> Void)?) 

它们非常方便,例如,我有一个类型为Boolean的变量,并且我想在其中完成一个函数的调用时将其状态从true更改为false,然后可以将下面的代码放到完成块中,将在函数末尾被调用,因此我的变量将为false。

 变量=!变量 

实际上,它并不像看起来那样难。 当您点击键盘上的“ enter”键时,我们将创建相同的效果,Xcode会自动为您打开补全框。 为了最大程度地减少使用自己的功能时的工作量。

1.创建一个函数:

 功能展示(didFinish:Bool){ 
打印(didFinish)
}

2.现在,将完成块添加到函数中:

不要忘记问号,因为餐后甜点不是必不可少的,所以完成块也是如此,在某些情况下,不需要完成块。

 函数演示(didFinish:Bool,完成:(()-> Void)?= nil){ 
打印(didFinish)
}

3.实施:

我们必须确保完成块中有内容,因此请先检查是否为nil,如果为nil,则从此处返回该函数,否则请继续。

 函数演示(didFinish:Bool,完成:(()-> Void)?= nil){ 
打印(didFinish)
后卫完成!=除此以外{
返回
}
完成!()
}

让我们使用它

  var demo = true 
示范(didFinish:演示){
演示=!演示
打印(演示)
}
//输出:
//正确
//错误

附言:如果您在函数中使用动画,则将完成块放在后面将无法解决问题,您必须为完成添加一个延迟(恰好是动画要花费的时间)。就像是:

  DispatchQueue.main.asyncAfter(截止日期:.now()+ YourAnimationTime){ 
完成!()
}

)。


感谢您的阅读,如果有什么我忘了提的话,请随时在评论部分询问我。 最后〜编码愉快〜🙂