小编典典

编译器错误:使用 Objective-C 选择器的方法与先前使用相同 Objective-C 选择器的声明冲突

all

我开始学习 Swift,并且一直在关注 YouTube
上非常好的斯坦福大学视频讲座。如果您有兴趣或者它有帮助,这里是一个链接(尽管它不是理解我的问题所必需的):

使用 Swift 开发 iOS 8 应用程序 - 2. 更多 Xcode 和
Swift、MVC

在听完讲座后,我发现(据我所知)我的代码与视频中的代码相同,但在我的系统上出现了编译器错误。经过大量的试验和错误后,我设法将我的代码简化为两个示例,其中一个会产生错误,另一个或不会产生错误,但我不知道究竟是什么导致了错误或如何解决它。

产生错误的代码是:

import UIKit

class BugViewController: UIViewController
{
    func perform(operation: (Double) -> Double) {
    }

    func perform(operation: (Double, Double) -> Double) {
    }
}

这会产生以下编译器错误:

方法 ‘perform’ 与 Objective-C 选择器 ‘perform:’ 与先前使用相同 Objective-C 选择器的声明冲突

通过简单地删除 UIViewController 的子类,代码编译:

import UIKit

class BugViewController
{
    func perform(operation: (Double) -> Double) {
    }

    func perform(operation: (Double, Double) -> Double) {
    }
}

其他一些可能相关或不相关的信息:

  • 我最近升级到优胜美地。
  • 当我安装 Xcode 时,我最终得到了一个 Beta 版本(版本 6.3 (6D543q)),因为(如果我没记错的话)这是我需要在我的 OS X 版本上运行的版本。

我有一半希望这是编译器中的一个错误,否则这对我来说没有任何意义。非常感谢您的任何帮助!


阅读 59

收藏
2022-06-23

共1个答案

小编典典

Objective-C 不支持方法重载,你必须使用不同的方法名。当您继承 UIViewController 时,您继承了 NSObject 并使该类可与
Obj-C 互操作。另一方面,Swift 确实支持重载,这就是为什么当您删除继承时它可以工作的原因。

2022-06-23