swift中选择器的概念是什么?

时间:2016-01-20 21:00:58

标签: swift selector nstimer nsobject

我见过需要参数选择器的对象。理解选择器的一般概念是什么?

选择选择器的一个例子是NSTimer,我选择的选择器是一个递增计数器的函数。

  timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: ("incrementCounter"), userInfo: nil, repeats: true)

2 个答案:

答案 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:您的选择器字符串周围的括号也不需要。