我见过需要参数选择器的对象。理解选择器的一般概念是什么?
选择选择器的一个例子是NSTimer,我选择的选择器是一个递增计数器的函数。
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: ("incrementCounter"), userInfo: nil, repeats: true)
答案 0 :(得分:3)
选择器是来自Objective-C的概念,其表示在运行时动态发送的消息(即,要被调用的方法)。当您通过选择器设置要执行的操作时,您知道将发送哪条消息,但不一定知道它的参数是什么。 (有时甚至不会将它发送到哪个对象。)
您可以将选择器视为闭包/块的相对关系,因为它们允许您打包一些稍后要调用的代码并将其移交给其他函数。但是,必须在编译时指定/解析闭包,因此它的动态性低于选择器。
选择器非常适合“松散绑定”概念,如控制操作。您可以使用选择器在Interface Builder中选择按钮在单击时应调用哪种方法,即使您的应用实际上没有在IB中运行;或者您可以说“此按钮应该在任何文本视图具有键盘焦点时调用paste:
”,不知道何时设置按钮哪个视图(因为键盘焦点一直在变化)。
ObjC中的选择器优先于块/闭包,因此从历史上看,选择器是告诉API类似“稍后调用此方法”的主要方式,这就是为什么你在整个Cocoa中找到它们的方式,如定时器,数组排序和撤消即使这样的模式可能会从封闭/块的紧密绑定中获益更多。
有关在Swift中使用选择器的更多信息,请参阅使用Swift with Cocoa和Objective-C 和/或Interacting with Objective-C APIs中的this SO answer。有关选择器和Cocoa的更多信息,请参阅Cocoa Core Competencies: Selector。
答案 1 :(得分:2)
selector
是一种自定义方法,在计时器触发时,在target
指定的类中调用。如果该方法应该采用参数,则每个参数都用冒号表示。
在Swift中,struct
Selector
响应协议StringLiteralConvertible
,
因此 - 由于编译器知道示例中的类型 - 文字字符串被隐式转换为Selector
实例,并且不需要Selector
初始值设定项。
PS:您的选择器字符串周围的括号也不需要。