Ios Objective-C选择器不推荐更换

Ios Objective-C选择器不推荐更换,ios,swift,Ios,Swift,正如许多问题最近所显示的,文字选择器已被弃用。有一个快速修复方法,如果选择器只在那个类中,它就可以正常工作 但是考虑这个例子(我有更多的代码;这是一个简化的例子): 此实用程序方法为我提供了在各种视图控制器中使用的良好功能。由于它有多种用途,我必须将它复制到每个视图控制器,以使用新的#选择器语法。但是苹果,为什么不赞成更动态的方法呢?我猜在新版本中,他们只会删除它,比如I++,I--和C-stylefor循环(但它们很容易被替换,尽管我不明白为什么要删除它们)。在将来的版本中,是否有任何变通方法

正如许多问题最近所显示的,文字选择器已被弃用。有一个快速修复方法,如果选择器只在那个类中,它就可以正常工作

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

此实用程序方法为我提供了在各种视图控制器中使用的良好功能。由于它有多种用途,我必须将它复制到每个视图控制器,以使用新的
#选择器
语法。但是苹果,为什么不赞成更动态的方法呢?我猜在新版本中,他们只会删除它,比如
I++
I--
和C-style
for
循环(但它们很容易被替换,尽管我不明白为什么要删除它们)。在将来的版本中,是否有任何变通方法可以保持这种方法的有效性?每个新版本都会破坏我所有的项目语法

为什么不赞成更动态的方法

发件人:

我们使开发人员不必手动进行命名转换,并对方法是否存在以及是否暴露于Objective-C进行静态检查

对于您的方法,您可以制定一个协议,表明存在某种方法:

@objc protocol MenuButtonClickable {
    func menuButtonClicked()
}
在视图控制器中,添加以下方法:

extension MyViewController : MenuButtonClickable {
    func menuButtonClicked() {
        // do something
    }
}
然后更新方法签名以使用此协议:

static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem {
现在,Swift编译器保证
控制器
具有该方法,因此您可以使用新的
#选择器
语法


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

谢谢您的回答!您的协议方法正在工作。奇怪的是,我不必编写对现有类的扩展,但它仍然有效。。至于反对某些方法,我已经读过了,但仍然不同意。。删除语法会破坏很多代码。我可以修改代码,但这需要时间。。而且我还使用了很多第三方库。@Makalele我很高兴它成功了!
扩展不是必需的,它只是一种风格建议,可以使协议实现彼此独立。我怀疑Swift代码在接下来的几年里会继续半定期地中断,所以如果它真的让你恼火,你可能会想回到Objective-C。是的,我知道扩展是不需要的,但我想我至少必须在所有使用它的类中遵守该协议。相反,我不需要做任何事情,它成功了。将“menuButtonClicked”更改为“menuButtonClicked2”在编译时不会引发任何错误。当然,当我试图触发它时,应用程序崩溃了。@objc关键字在该代码中到底给出了什么?
@objc
意味着一个类型要符合该协议,它必须转换为Objective-C类型(即,它不能是Swift结构)。如果删除
@objc
addTarget:
行将不会编译,因为
菜单按钮可点击
将无法转换为
id
static func createMenuButton(controller:MenuButtonClickable) -> UIBarButtonItem {