1

我正在尝试传递一个函数以将其作为目标添加到 Swift3 中的 UIButton,但出现以下错误:

Argument of '#selector' does not refer to an '@objc' method, property, or initializer

这是我的代码:

func updateButtonAction(_ action: () -> (), button: UIButton) {
    button.addTarget(self, action: #selector(customFunction(action)), for: .touchUpInside)
}

func customFunction(_ function: () -> ()) {
    function()
}

我将传入的函数包装在另一个函数中,所以我知道拥有它的类。

我认为问题在于 Objective-C 不支持 Swift 中的第一类函数,并且 selector 关键字仅使用 Objective-C 函数。

有谁知道解决这个问题的方法?

4

1 回答 1

1

选择器只是方法名称的一个奇特的同义词。它不是闭包或函数。它是 Obj-C 对象上的方法的名称。从技术上讲,选择器是一个字符串。

customFunction(action)不是选择器。选择器是customFunction(_:).

您正在尝试将隐式参数传递给选择器。这不是选择器的工作方式。您没有调用该方法,您只是在告诉UIButton它应该调用哪个方法 -UIButton正在调用该方法,并且该按钮还指定了参数。

如果您需要将一些代码传递给事件处理程序,请将其保存在您的实例上。

var function: (() -> Void)?

func customFunction() {
    self.function?()
}

一般来说,最好只有一个事件处理程序而不更改它。

另请注意,您的示例不需要一流的功能。

于 2017-03-30T14:13:38.403 回答