在选择器中使用Swift3函数参数

时间:2017-03-30 14:07:55

标签: ios swift first-class-functions

我尝试传入一个函数,将其作为目标添加到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函数。

有没有人知道解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

var function: (() -> Void)?

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

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

另请注意,您的示例不需要第一类函数。