在变量中存储代码块

Storing Block of code inside variable

这很简单,我确定我遗漏了什么。

我试图了解如何实现以下目标:action 应该 "hold" 一段代码,我最终会在 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 <--> 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)

(在 Playground 中编译良好)

您的操作不带任何参数,也不 return 任何东西,因此它们的类型为:

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

编辑:我最初写道,你应该使用 [weak self] 来避免循环保留,因为我没有注意到 action 是在函数内部声明的。由于它在函数内部,action 将在函数完成后释放,因此没有保留周期。