在变量内存储代码块



这很简单,我敢肯定我缺少一些东西。

我正在尝试了解如何实现以下操作:action应该"持有"代码块,我最终将在UIView.animate内执行(例如)。

正确的方法是什么? 我是否应该担心在action闭合内使用self.

样本功能:

func forward(_ sender : UIButton) {
 var action : <Clousre of somekind?>
 switch currentPosition
  {
   case 0 : action = { self.view.background = .red }
   case 1 : action = { self.view.background = .blue }
   default : fatalError("No current Position")
  }
 UIView.animate(withDuration: 1, animations: {
    action
  })
 }

谢谢!:)

这样声明:

var action: () -> Void

没有保留周期。

self不含action的引用。

如果action将是属性(函数之外),则将有一个保留周期:

self.action&lt; -> action = { self... }

组合:

var action : () -> Void
switch currentPosition {
    case 0 : action = { /*do something*/ }
    case 1 : action = {  /*do something*/ }
    default : fatalError("No current Position")
}
UIView.animate(withDuration: 1, animations: {
    action()
})
// or
UIView.animate(withDuration: 1, animations: action)

(在操场上汇编罚款)

您的动作不采取任何参数,也不返回任何内容,因此它们是类型:

var action: (() -> ())
// or, if you want action to be optional:
var action: (() -> ())?

edit :我最初写的是,您应该使用[weak self]避免保留周期,因为我没有注意到函数内声明了action。由于它在函数内部,action将在函数完成后进行处理,因此没有保留周期。

最新更新