swift - 具有相同名称的多个函数

标签 swift

我是 Swift 的新手,我浏览了一些教程,其中许多教程不止一次定义了一个同名函数。

我已经习惯了其他编程语言,在这些语言中无法完成此操作,否则会引发错误。

所以我查了一下官方Swift Manual并检查了 override关键字看看我能从中得到什么,但我仍然无法理解以下代码:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "MyTestCell")

    cell.textLabel?.text = "Row #\(indexPath.row)"
    cell.detailTextLabel?.text = "Subtitle #\(indexPath.row)"

    return cell
}

据我所见,函数 tableView 是在第 1 行和第 5 行中设置的,我注意到的唯一区别是第一个 tableView 函数返回一个 Int 而第二个返回一个 Object (UITableViewCell)。

在这种情况下,我从结果中看到第二个函数没有覆盖第一个函数。

这是什么意思,为什么可以多次定义同名函数而不覆盖它?

最佳答案

如果它们具有不同的类型,或者如果它们可以通过它们的外部参数参数标签来区分,那么您可以定义两个具有相同名称的函数。函数的Type由括号中的参数Types,后面是->,再后面是return Type组成。请注意,参数标签不是函数类型的一部分。 (但请参阅下面的更新。)

例如,以下函数同名且类型为(Int, Int) -> Int:

// This:
func add(a: Int, b: Int) -> Int {
    return a + b
}

// Is the same Type as this:
func add(x: Int, y: Int) -> Int {
    return x + y
}

这将产生编译时错误 - 将标签从 a:b: 更改为 x:y: 不会区分这两个函数。 (但请参阅下面的更新。)

以Mr.Web的功能为例:

// Function A: This function has the Type (UITableView, Int) -> Int
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }

// Function B: This function has the Type (UITableView, NSIndexPath) -> UITableViewCell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { ... }

// Function C: This made up function will produce a compile-time error because
// it has the same name and Type as Function A, (UITableView, Int) -> Int:
func tableView(arg1: UITableView, arg2: Int) -> Int { ... }

上面的Function A和Function B不冲突,因为它们属于不同的Type。 上面的函数 A 和函数 C 确实冲突,因为它们具有相同的类型。如果类型保持不变,则更改参数标签不会解决冲突。 (请参阅下面的更新。)

override 是一个完全不同的概念,我认为其他一些答案涵盖了它,所以我将跳过它。

更新:我上面写的一些内容是不正确的。一个函数的参数标签确实不是它的类型定义的一部分,但它们可以用来区分两个具有相同类型的函数,只要函数有不同的外部标签,编译器就可以分辨出哪个调用它时尝试调用的函数。示例:

func add(a: Int, to b: Int) -> Int {    // called with add(1, to: 3)
    println("This is in the first function defintion.")
    return a + b
}

func add(a: Int, and b: Int) -> Int {   // called with add(1, and: 3)
    println("This is in the second function definition")
    return a + b
}

let answer1 = add(1, to: 3)    // prints "This is in the first function definition"
let answer2 = add(1, and: 3)   // prints "This is in the second function definition"

因此,在函数定义中使用外部标签将允许具有相同名称和相同类型的函数编译。因此,您似乎可以编写多个具有相同名称的函数,只要编译器可以通过它们的类型或它们的外部签名标签来区分它们。我认为内部标签并不重要。 (但如果我错了,我希望有人能纠正我。)

关于swift - 具有相同名称的多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690076/

相关文章:

swift - 为什么扩展不能添加存储属性

ios - SwiftUI 中的可选 @ObservableObject

swift - GK状态 : Why is StateMachine == nil on delegate call?

swift - 实例化的可选变量在 Xcode 调试器中显示为 nil

objective-c - "Extra argument ' foo ' in call"或 "' [NSObject : AnyObject]! ' is not a subtype of ' Dictionary<Key, Value> '"

swift - 监听 rxswift 的变化

swift - 如何在代码创建的 ScrollView 上捏放大

iOS - 根据开关值启用/禁用一组通知

ios - UICollectionView 延迟/掉帧

ios - 转换后关闭 ViewController 以释放内存