Swift 2.3中#selector update的优势是什么?

Cra*_*aig 5 swift

只是将方法名称写为字符串,我看不出问题.我只是好奇为什么这更好?

mat*_*att 13

这是一个巨大的变化.基本上,这关闭了语言中最大的崩溃漏洞.

如果您将Selector形成为字符串文字,并且形成错误 - 这太简单了 - 或者如果您正确形成但有问题的方法没有暴露给Objective-C,那么您将在运行时因可怕的Unrecognized而崩溃选择器控制台消息 - Objective-C和Swift中最常见的崩溃.(对"无法识别的选择器"执行堆栈溢出;您将看到我的意思.)

现在,#selector语法意味着您将使用函数引用形成Selector ,编译器将在编译时检查该函数引用.如果你犯了一个错误,编译器会阻止你死.如果你做得对,编译器会为你正确地构建选择器.你不需要知道任何关于如何形成选择串; 编译器完成所有工作.因此,以这种方式崩溃的可能性有效地降低到零."无法识别的选择器"崩溃作为一个门槛死了.


Hun*_*onk 5

#selector更新允许您使用自动完成功能.使用字符串文字时,您可以添加一个拼写错误,这会产生运行时错误.

只是要补充一点,当在Xcode中使用迁移工具时,Xcode会将您的选择器更改为:

#selector(MyController.myMethod)
Run Code Online (Sandbox Code Playgroud)

删除类的名称可以使它更清洁,如下所示:

#selector(myMethod)
Run Code Online (Sandbox Code Playgroud)


Zel*_*lko 2

\xe2\x80\x9c在 Swift 2.2 之前,选择器是字符串文字,很容易出错,因为我们作为人类发明的,只要有机会在没有自动完成的情况下编写某些内容,仍然会导致拼写错误。\xe2\x80\x9d

\n\n

https://medium.com/swift-programming/swift-selector-syntax-sugar-81c8a8b10df3#.8ki9dd38j

\n

  • 不仅是自动完成,而且最重要的是,如果您犯了错误,将会出现编译时错误,而不是运行时错误。 (6认同)