我只是将方法名称写为字符串时看不到问题。我只是好奇为什么这更好?
答案 0 :(得分:13)
这是巨大的更改。基本上,这关闭了语言中最大的崩溃漏洞。
如果您将Selector形成为字符串文字,并且形成错误 - 这太简单了 - 或者如果您正确形成但有问题的方法没有暴露给Objective-C,您将崩溃在运行时与可怕的无法识别的选择器控制台消息 - Objective-C和Swift中最常见的崩溃。 (对“无法识别的选择器”执行堆栈溢出;您将看到我的意思。)
现在,#selector
语法意味着您将使用函数引用形成Selector,编译器将在编译时检查 。如果你犯了一个错误,编译器会阻止你死。如果你做得对,编译器会为你正确地构建选择器。您不需要知道关于如何形成Selector字符串的任何;编译器完成所有工作。因此,以这种方式崩溃的可能性有效地降低到零。 “无法识别的选择器”崩溃作为一个门槛死了。
答案 1 :(得分:5)
#selector
更新可让您使用自动填充功能。使用字符串文字时,您可以添加一个拼写错误,这会产生运行时错误。
添加,在Xcode中使用迁移工具时,Xcode会将您的选择器更改为:
#selector(MyController.myMethod)
删除课程可以接受'使它更清洁的名称,如下:
#selector(myMethod)
答案 2 :(得分:2)
“在Swift 2.2之前,选择器是字符串文字并且容易出错,因为我们正如人类发明的那样,并且只要有机会在没有自动完成的情况下编写内容,就会导致错别字。”
https://medium.com/swift-programming/swift-selector-syntax-sugar-81c8a8b10df3#.8ki9dd38j