在变量中存储代码块

时间:2016-12-09 18:48:01

标签: swift swift3 closures block retain-cycle

这很简单,我确定我错过了什么。

我试图了解如何实现以下目标:action应该"持有"一段代码,我最终将在UIView.animate内执行(例如)。

什么是正确的方法? +我是否应该担心在self.封闭内使用action保留周期?

示例功能:

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
  })
 }

谢谢! :)

2 个答案:

答案 0 :(得分:2)

声明如下:

var action: () -> Void

没有保留周期。

self未提及action

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

self.action&lt; - &gt; 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)

(在游乐场编译好)

答案 1 :(得分:0)

您的操作不带任何参数,也不会返回任何内容,因此它们属于以下类型:

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

编辑:我最初写道,您应该使用[weak self]来避免保留周期,因为我没有注意到函数内部已声明action。由于它在函数内部,action将在函数完成后解除分配,因此没有保留周期。