Хороший вопрос.
Обратите внимание, что это поведение/ограничение не задокументировано, и ответ - мое лучшее предположение.
Рассмотрим следующий фрагмент кода:
func foo() -> (param:Int)->() {
func bar(param: Int) {
// do stuff
}
return bar
}
Функция вернет замыкание bar
. Если вы должны были иметь другое закрытие названием bar
в пределах одной и той же функции, как это ...
func foo() -> (param:Int)->() {
func bar(param: Int) {
// do stuff
}
func bar(param: Float) {
// do stuff
}
return bar
}
... они имеют конфликтующие имена и компилятор не знает, что вернуть. Это же, как и следующий фрагмент кода, который вы бы легко согласиться быть неправильно:
func foo() -> Int {
let a:Int = 0
let a:Int = 0 //Error
return a
}
Больше наблюдения
Поведение аналогичного набора функций внутри класса странно.
class Test {
func foo(param:Float) {
let bar = { (param:Int) ->() in
//do stuff
}
}
func foo(param:Int) {
let bar = { (param:Int) ->() in
//do stuff
}
}
func anotherFoo() {
println(self.foo) //Compile time error - Ambiguous use of foo
}
}
Все, хотя ...
class Test {
func foo(param:Float) {
let bar = { (param:Int) ->() in
//do stuff
}
}
func anotherFoo() {
println(self.foo) //Compiles
}
}
Интересно.
Я не уверен, но следующее дает идентичную ошибку, поэтому это, вероятно, случай рассмотрения их как локальных идентификаторов, привязанных к clousres: 'func foo() -> (Int) ->() { let bar : (Int) ->() = {(параметр: Int) в println (param)} let bar: (String) ->() = {(параметр: String) в println (param)} панель возврата } ' – BaseZen