Вложенная функция Swfit - PullRequest
       10

Вложенная функция Swfit

0 голосов
/ 16 января 2019

В кратком руководстве по языкам о вложенной функции: https://docs.swift.org/swift-book/LanguageGuide/Functions.html#ID166

код в разделе:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
    var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")

Мои вопросы:

  1. что означает первая стрелка? Я знаю, как вернуть значение, т.е. -> int, но в этом случае есть два возвращаемых значения (или стрелки?)? func chooseStepFunction (backward: Bool) -> (Int) -> Int

  2. в операторе возврата, назад? stepBackward: stepForward почему stepBackward / stepForward не нуждаются в скобках при вызове этих функций?

  3. currentValue = moveNearerToZero (currentValue), почему мы можем вызывать функцию с переменной moveNearerToZero ?? Кроме того, зачем нужна скобка после moveNearerToZero ??

Спасибо

1 Ответ

0 голосов
/ 16 января 2019
  1. давайте начнем с первой точки

    func chooseStepFunction(backward: Bool) -> (Int) -> Int

Посмотрев это объявление функции, вы можете сказать, что chooseStepFunction - это функция, которая принимает один аргумент типа Bool и возвращает функцию типа (Int)-> Int, которая принимает один аргумент Int в качестве параметра и возвращает Int , поэтому здесь chooseStepFunction возвращает функцию типа (Int)->Int на основе переданного в backward параметра.

  1. В следующем операторе return мы не вызываем stepBackward или stepForward, поэтому мы не используем скобки (). с самого начала вы должны понимать, что chooseStepFunction вернет функцию, и эта функция имеет тип (Int)->Int, и внимательно посмотрите, вы обнаружите, что stepBackward and stepForward сигнатура (Int)->Int, которая вернется к chooseStepFunction

return backward ? stepBackward : stepForward

3.

let moveNearerToZero = chooseStepFunction(backward: currentValue > 0) здесь chooseStepFunction возвращают функцию типа (Int)->Int, которая хранится в moveNearerToZero, так что это не простая переменная, это функция, поэтому мы можем использовать скобки.

Следующее описание взято из быстрой документации, которая объясняет, как вы можете использовать функцию как тип:

Использование типов функций Вы используете типы функций, как и любые другие типы в Swift. Например, вы можете определить константу или переменную для типа функции и назначить соответствующую функцию для этой переменной:

var mathFunction: (Int, Int) -> Int = addTwoInts Это можно прочитать как:

«Определите переменную с именем mathFunction, которая имеет тип« функция, которая принимает два значения Int и возвращает значение Int. ’Установите эту новую переменную так, чтобы она ссылалась на функцию с именем addTwoInts».

Функция addTwoInts(_:_:) имеет тот же тип, что и переменная mathFunction, поэтому это присваивание разрешено средством проверки типов Swift.

Теперь вы можете вызывать назначенную функцию с именем mathFunction:

print("Result: \(mathFunction(2, 3))")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...