我开始学习Swift,并一直在关注YouTube上非常好的斯坦福大学视频讲座.以下是一个链接,如果你感兴趣或它有帮助(尽管不需要了解我的问题):

Developing iOS 8 Apps with Swift - 2. More Xcode and Swift, MVC

在听完讲座后,我发现(据我所知)我的代码与视频中的代码完全相同,但在我的系统中,我遇到了一个编译器错误.经过大量的try 和错误,我成功地将代码缩减为两个示例,其中一个生成错误,另一个不生成错误,但我不知道是什么导致了错误,也不知道如何解决错误.

产生错误的代码是:

import UIKit

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

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

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

方法"perform"与Objective-C Select 器"perform:"与之前使用同一Objective-C Select 器的声明冲突

只需删除UIViewController的子类,代码即可编译:

import UIKit

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

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

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

  • 我最近升级到了约塞米蒂.
  • 当我安装Xcode时,我最终得到了一个测试版(版本6.3(6D543q)),因为(如果我没记错的话)这是我需要在我的OS X版本上运行的版本.

我有点希望这是编译器中的一个bug,否则这对我来说毫无意义.感谢您的帮助!

推荐答案

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

Swift相关问答推荐

错误CGPathGetClientPoint:没有当前点.& '?

UITableView未显示类数组数据

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

RealityKit如何获得两个相对大小相同的ModelEntity?

将`@Environment`值赋给`Binding`参数

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

使用 @resultBuilder 的通用 buildList 函数

Swift 运算符中 inout 的行为

子视图未在父视图 SwiftUI 中触发禁用状态更新

macOS 的窗口框架中使用的真实类型和真实类型是什么?

MainActor 隔离可变存储属性为何会出现可发送错误?

在 Swift 中为(递归)扩展提供默认实例参数

自定义 DispatchQueue 服务质量

不要从 NumberFormatter 获取货币符号

无法使用锚激活约束

在 Swift 中强制崩溃的最简单方法

如何从 Button 获取标签名称?

如何在 Swift 中遍历 struct 属性?

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

swift中静态函数和单例类的区别