swift - 如何将闭包作为变量传递?
问题描述
我有来自操场的以下代码:
class MyButton {
var pressed: (() -> Void)?
func press() {
pressed?()
}
}
class SomeView {
var buttonDidPressed: (() -> Void)?
let button = MyButton()
init() {
button.pressed = buttonDidPressed
}
func press() {
button.press()
}
}
let view = SomeView()
view.buttonDidPressed = {
print("pressed")
}
view.press()
MyButton
有在被调用pressed
时执行的闭包。press
在s init 中,我为该闭包SomeView
赋值。pressed
当然,在初始化时,它是nil
. 但是在初始化之后,我给那个闭包SomeView
赋值。buttonDidPressed
因为,闭包是引用类型,当view.press
被调用时,buttonDidPressed
不应该是 nil。但是,无论如何,我的打印没有执行。为什么?
解决方案
您首先初始化SomeView
(init
函数被调用),然后设置buttonDidPressed
属性。因此,该buttonDidPressed
属性具有您的闭包,但从未将其传递给MyButton
实例。
您可以使用didSet
它立即更新它:
class SomeView {
var buttonDidPressed: (() -> Void)? {
didSet {
button.pressed = buttonDidPressed
}
}
let button = MyButton()
func press() {
button.press()
}
}
更新:你也可以SomeView
像这样在初始化器中传递你的闭包:
class SomeView {
let button = MyButton()
init(buttonDidPressed: (() -> Void)?) {
button.pressed = buttonDidPressed
}
func press() {
button.press()
}
}
let view = SomeView {
print("pressed")
}
view.press()
推荐阅读
- java - Java:使用枚举调用类中的set方法
- talend - 在使用 Talend Studio 进行并行化工作之后,我必须执行更多工作。如何放置连接 OnSubJobOk?
- c++ - 将变量用于文件路径如何工作?
- php - elasticsearch查询构造中的if else语句
- ruby-on-rails - Ruby Rails 语法说明
- python - 将列表中的元素排序为3个单独的列表python
- c - 使用特定输入的 Malloc 中止
- c - 为什么我的程序会自动释放东西?
- ruby-on-rails - Rails 5 - 默认日期时间格式为 RFC3339
- android - 为什么我不能从 Android 中的服务中读取字符串资源