当前位置: 首页 > 面试题库 >

具有相同名称的多种功能

仰翔
2023-03-14
问题内容

我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。

我已经习惯了其他编程语言,否则将无法执行此操作。

因此,我检查了官方的Swift手册,还检查了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)。

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

这是什么意思?为什么可以使用相同的名称多次定义一个函数而不覆盖它?


问题答案:

如果两个函数具有不同的类型,或者可以通过其外部参数参数标签加以区分,则可以使用两个相同的名称来定义它们。函数的类型由括号中的参数Types组成,其后是->,然后是返回Type。请注意,参数标签不是函数的类型的一部分。
(但请参见下面的更新。)

例如,以下函数都具有相同的名称并且属于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:不区分这两种功能。 (但请参见下面的更新。)

以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 { ... }

上面的功能A和功能B不冲突,因为它们是不同的类型。 上面的函数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"

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



 类似资料:
  • 当相应的列>0时,我需要将一些数据列设置为NA。 我也在考虑重塑,这样我就可以做一个变异。这里最好的做法是什么?

  • 问题内容: 我正在尝试使用RSA 7.5和Websphere 7服务器开发IBM JAX_WS Web服务。因为我是一个初学者,所以我遵循Java类优先方法,即首先创建Java类,然后生成WSDL文件。 当我尝试创建wsdl文件时,出现异常: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.I

  • 问题内容: 我正在用C#编写.NET Framework 3.5。 我正在尝试将某些Json解析为JObject。 Json如下: 当我尝试将此Json解析为JObject时,JObject仅了解LargeBox。SmallBox和MedBox的信息丢失。显然,这是因为它将“ TBox”解释为一个属性,并且该属性已被覆盖。 我从Delphi编码的服务中收到此Json。我正在尝试为该服务创建C#代理

  • 问题内容: 我有超一流的Foo。还有一个扩展它的类Bar。 在Foo中的功能: 酒吧功能: 出现错误: 我究竟做错了什么? 问题答案: 您正在使用不兼容的类型覆盖该方法。也许您想做类似的事情: 功能在 和功能在酒吧:

  • 问题内容: 我的问题是为什么我不能再次调用该函数?或者,如何做到这一点? 假设我有这个功能: 我称之为: 我得到4。 但是,假设我声明了一个与该函数同名的变量(错误): 现在,如果我尝试这样做: 要么: 我将收到此错误:“ TypeError:’int’对象不可调用” 无法将变量“ a”分配给函数? 问题答案: 完成此操作后: 不再是一个 函数 ,而只是一个 整数 (您已将其重新分配!)。因此,很

  • 我使用的是,我需要展平包含同名字段的文档。 我创建的文档如下所示: 在那之后,我试图像下面这样压平文档: 我的主要方法是: 展平后,我得到的文档包含一个展平字段,但我必须得到两个展平字段。 如何解决此问题?