【发布时间】:2019-04-10 22:57:21
【问题描述】:
我正在向按钮添加目标,但不是让目标操作引用预定义函数,而是希望它引用闭包。
typealias AlertAction = (title: String, handler: () -> ())
class ErrorView: UIView {
func addAction(_ action: AlertAction) {
let button = UIButton()
...
let selector = #selector(action.handler) //error happens here
button.addTarget(self, action: selector, for: .touchUpInside)
}
}
我在这一行遇到错误:
let selector = #selector(action.handler)
这是“'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序”
这是有道理的,因为通常您必须将 @objc 添加到您的 func 声明中,但我想知道是否有办法让我的闭包事后引用 @objc 方法,也许是通过将它包装在另一个函数中。
这可能吗?我不知道如何定义 @objc 标记的闭包,所以我不确定。
【问题讨论】:
-
在 Swift 闭包的世界和 ObjectiveC 目标/选择器的世界之间架起一座桥梁并不容易。您能做的最好的事情是尝试编写一些使用 ObjectiveC 运行时的代码来创建一个接受闭包的函数(将限制为
@convention(c)),将其作为方法添加到假类中,并为您提供一个然后您可以使用该选择器来引用该方法。不过,这会很棘手。