我尝试传入一个函数,将其作为目标添加到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函数。
有没有人知道解决这个问题?
答案 0 :(得分:1)
Selector只是方法名称的一个奇特的同义词。它不是闭包或函数。它是Obj-C对象上方法的名称。从技术上讲,选择器是一个字符串。
customFunction(action)
不是选择器。选择器为customFunction(_:)
。
您正尝试将隐式参数传递给选择器。这不是选择者的工作方式。你没有调用方法,你只是告诉UIButton
它应该调用哪个方法 - UIButton
正在调用方法,按钮也指定了参数。
如果您需要将一些代码传递给事件处理程序,请将其保存在您的实例上。
var function: (() -> Void)?
func customFunction() {
self.function?()
}
一般来说,只有一个事件处理程序而不是更改它是一个好主意。
另请注意,您的示例不需要第一类函数。