Ответ 1
Вам разрешено определять две функции с тем же именем, если они имеют разные типы, или если их можно различить по их внешним меткам аргументов параметра. Тип функции состоит из параметра Типы в круглых скобках, за которым следует ->
, за которым следует возвращаемый тип. Обратите внимание, что метки аргументов НЕ являются частью функции Type. (Но см. UPDATE ниже.)
Например, следующие функции имеют одинаковое имя и имеют тип (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:
не отличает две функции. (Но см. UPDATE ниже.)
Использование функций г-на Веб в качестве примеров:
// 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 выше конфликтуют, потому что они имеют один и тот же тип. Изменение меток параметров не разрешает конфликт, если типы остаются неизменными. (См. UPDATE ниже.)
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"
Таким образом, использование внешних меток в определении функции позволит компилировать функции с тем же именем и того же типа. Таким образом, кажется, что вы можете писать несколько функций с тем же именем, если компилятор может различать их по их типам или по своим ярлыкам подписи. Я не думаю, что внутренние этикетки имеют значение. (Но я надеюсь, что кто-то меня исправит, если я ошибаюсь.)