3

Перегрузка методов в Swift работает, как ожидалось, но когда я пытаюсь перегружать вложенные функции, такие, какВложенные функции перегрузки в Swift

func foo() { 
    func bar(param: Int) { 
     // do stuff 
    } 
    func bar(param: Double) { 
     // do stuff 
    } 

    // call functions here 
} 

Я получаю сообщение об ошибке говорящее Definition conflicts with previous value. Почему это происходит?

+1

Я не уверен, но следующее дает идентичную ошибку, поэтому это, вероятно, случай рассмотрения их как локальных идентификаторов, привязанных к clousres: 'func foo() -> (Int) ->() { let bar : (Int) ->() = {(параметр: Int) в println (param)} let bar: (String) ->() = {(параметр: String) в println (param)} панель возврата } ' – BaseZen

ответ

3

ИМХО это яснее, если рассмотреть этот вариант:

func foo() { 

    let bar: (param: Int) ->() = { p in 
     // do stuff 
    } 

    func bar(param: Double) { 
     // do stuff 
    } 

    // call functions here 
} 

С первого определения bar функции вы просто объявляя константу типа (param: Int) ->(). Таким образом, с вашей второй декларацией вы объявляете другую константу другого типа (param: Double) ->(), но с тем же именем, что и объявленное bar.

Короче говоря, это так же, как Вы писали:

let bar: Int = 0 
let bar: Double = 0.0 

В этом случае компилятор будет жаловаться, а также.

Надеюсь, это поможет.

+0

Итак, это означает, что глобальные функции не имеют того же характера, что и вложенные функции.Это не документировано (я ничего не нашел об этом). Вложенными функциями являются lambdas/closures, которые не являются глобальными. –

+0

@ Jean-BaptisteYunès Честно говоря, я не могу сказать, является ли формально правильным, что глобальные функции не являются лямбдами. В любом случае глобальные функции не _close_. Из глобальных документов [doc] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html) определяется в глобальной области видимости_ (у объекта не существует области _outer_ на). Между тем для вложенных функций: _ Включая функцию, можно также вернуть одну из своих вложенных функций. Таким образом, вложенная функция закрывается вокруг своего контекста. Возможно, документация просто не использует формальный язык, используемый в других контекстах. –

+0

Спасибо большое! Док слишком низок, отсутствует формальное определение Свифта, или я чего-то пропустил? –

1

Хороший вопрос.

Обратите внимание, что это поведение/ограничение не задокументировано, и ответ - мое лучшее предположение.

Рассмотрим следующий фрагмент кода:

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 
    } 
} 

Интересно.

+0

Swift управляет именами функций/методов (в терминах класса) и как параметр функции бара отличается (один - Int, а другой - Double), конфликт не должен быть конфликтным. – Ch0k0l8

+0

Теперь имеет смысл. Сделали некоторые эксперименты. – avismara

Смежные вопросы