在变量中存储代码块
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
将在函数完成后释放,因此没有保留周期。
这很简单,我确定我遗漏了什么。
我试图了解如何实现以下目标: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
将在函数完成后释放,因此没有保留周期。