我是
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).
在这种情况下,我从结果中可以看到第二个函数不会覆盖第一个函数.
这是什么意思,为什么可以用同一个名字多次定义一个函数而不覆盖它?
如果具有不同的类型,或者可以通过其外部参数参数标签区分它们,则可以使用相同名称定义两个函数.函数的类型由括号中的参数Types组成,后跟 – >,后跟返回类型.请注意,参数标签不是函数类型的一部分. (但请参阅下面的UPDATE.)
例如,以下函数都具有相同的名称,并且具有Type(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:不区分这两个函数. (但请参阅下面的UPDATE.)
以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因冲突,因为它们具有相同的类型.如果类型保持不变,则更改参数标签不能解决冲突. (见下面的更新)
覆盖是一个不同的概念,我认为其他一些答案涵盖了它,所以我会跳过它.
更新:我上面写的一些是不正确的.这是一个函数的参数标签不是它的类型定义的一部分,但是它们可以用来区分具有相同类型的两个函数,只要该函数具有不同的外部标签,以便编译器可以知道哪个当您调用它时,您尝试调用的功能.例:
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"
因此,在函数定义中使用外部标签将允许具有相同名称和相同类型的函数进行编译.因此,您可以编写具有相同名称的多个函数,只要编译器可以根据其类型或其外部签名标签区分它们.我认为内部标签不重要. (但我希望有人会纠正我,如果我错了.)