Ios 将#选择器存储在变量中

Ios 将#选择器存储在变量中,ios,swift,Ios,Swift,我正在向按钮添加一个目标,但是我不希望目标操作引用预定义的函数,而是希望它引用一个闭包 typealias AlertAction = (title: String, handler: () -> ()) class ErrorView: UIView { func addAction(_ action: AlertAction) { let button = UIButton() ... let selector = #selector(action.ha

我正在向按钮添加一个目标,但是我不希望目标操作引用预定义的函数,而是希望它引用一个闭包

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方法,也许可以将它包装到另一个函数中

class AlertAction:NSObject {
    var title:String?

    @objc
    func getHandler(sender:Any){
        print("hi")
    }
}
这可能吗?我不知道如何定义@objc标记的闭包,所以我不确定。

#selector()
基于Objective-C桥接,因为swift闭包是非Objective-C的,所以不能使用它们

另一种解决方案是将代码封装在Objective-C函数中

class AlertAction:NSObject {
    var title:String?

    @objc
    func getHandler(sender:Any){
        print("hi")
    }
}
然后像这样使用它:

// Instance of a class
let alertAction = AlertAction()

// Usage
let button = UIButton()
let selector1 = #selector(AlertAction.getHandler)
button.addTarget(alertAction, action: selector1, for: .touchUpInside)
#selector()
基于Objective-C桥接,因为swift闭包是非Objective-C的,所以不能使用它们

另一种解决方案是将代码封装在Objective-C函数中

class AlertAction:NSObject {
    var title:String?

    @objc
    func getHandler(sender:Any){
        print("hi")
    }
}
然后像这样使用它:

// Instance of a class
let alertAction = AlertAction()

// Usage
let button = UIButton()
let selector1 = #selector(AlertAction.getHandler)
button.addTarget(alertAction, action: selector1, for: .touchUpInside)

在Swift闭包世界和ObjectiveC目标/选择器世界之间没有简单的桥梁。您所能做的最好的事情就是尝试编写一些代码,使用ObjectiveC运行时生成一个接受闭包的函数(该闭包将被限制为
@convention(c)
),将其作为方法添加到伪类中,并为您提供一个选择器,然后您可以使用该选择器引用该方法。不过,这将是相当棘手的。看看吧。在Swift闭包世界和ObjectiveC目标/选择器世界之间,没有一种简单的方法可以架起桥梁。您所能做的最好的事情就是尝试编写一些代码,使用ObjectiveC运行时生成一个接受闭包的函数(该闭包将被限制为
@convention(c)
),将其作为方法添加到伪类中,并为您提供一个选择器,然后您可以使用该选择器引用该方法。不过,这会很棘手。看一看。