Objective-Cselect器不推荐使用replace

正如许多问题最近所显示的那样,字面select器已被弃用。 有一个快速的解决scheme,如果select器只在一个类中就可以正常工作。

但是考虑一下这个例子(我有更多的代码,这是一个简单的例子):

static func createMenuButton(controller:UIViewController) -> UIBarButtonItem { let menuButton = UIButton(frame: CGRectMake(0, 0, 22, 22)) menuButton.addTarget(controller, action: Selector("menuButtonClicked:"), forControlEvents:.TouchUpInside) let menuButtonContainer = UIView(frame: menuButton.frame) menuButtonContainer.addSubview(menuButton) let menuButtonItem = UIBarButtonItem(customView: menuButtonContainer) return menuButtonItem } 

这个实用方法给了我很好的function,可以在各种视图控制器中使用。 由于它的多重用法,我必须将其复制到每个视图控制器以使用新的#selector语法。 但苹果,为什么贬低更dynamic的方法? 我想在新版本中,他们会删除它,像i++i++和C风格for循环(但是它们可以很容易地被replace,但我不明白为什么它们会被删除)。 是否有任何解决方法来保持这种方法在未来的版本中工作? 每个新版本都打破了我所有的项目语法。

为什么弃用更多的dynamic方法?

从build议做出这个改变 :

我们免费开发人员必须手动进行命名翻译,并静态检查该方法是否存在,并暴露给Objective-C。

对于你的方法,你可以制定一个协议,指出某种方法是存在的:

 @objc protocol MenuButtonClickable { func menuButtonClicked() } 

在你的视图控制器中,添加这个方法:

 extension MyViewController : MenuButtonClickable { func menuButtonClicked() { // do something } } 

然后更新你的方法签名来使用这个协议:

 static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem { 

现在Swift编译器保证了controller有这个方法,所以你可以使用新的#selector语法。

如果你不小心尝试在没有这个函数的视图控制器上使用这个方法,你会得到一个编译时错误,而不是运行时错误。