如果它们具有不同的类型,或者如果它们可以通过它们的外部参数参数标签来区分,则可以使用相同的名称定义两个函数。函数的类型由括号中的参数类型组成,后面是->,后面是返回类型。请注意,参数标签不是函数类型的一部分。 (但请参阅下面的更新。)
例如,以下函数同名且类型为(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 不冲突,因为它们属于不同的类型。 上面的do函数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"
因此,在函数定义中使用外部标签将允许编译具有相同名称和相同类型的函数。因此,您似乎可以编写多个具有相同名称的函数,只要编译器可以通过它们的类型或它们的外部签名标签来区分它们。我认为内部标签并不重要。 (但如果我错了,我希望有人能纠正我。)