я не могу понять поведение метода - PullRequest
0 голосов
/ 16 сентября 2018
func mymethod(getno:Int)->(myval :Int,defaults :Int){
    return (getno,8)
 }
 print(mymethod(getno: 2))

выход для вышеуказанной программы мой вал 2 по умолчанию 8

хорошо, я могу понять вышеуказанную программу

но метод ниже сомнительный для меня

func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

Я не могу понять эту строку (var increment = makeIncrementer ()), что там происходит?

Есть кто-нибудь, кто может мне кратко объяснить это?

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Вы не одиноки. Мне было трудно обернуть голову вокруг этого, когда я только начинал :))

То, что вы видите, это «функция, возвращающая другую функцию». Думайте о функциях как о чёрных ящиках, которые принимают и выплевывают вещи. Теперь представьте, что вы можете передавать их, как если бы они были значениями типа 10 или "Hello".

makeIncrementer возвращает функцию. Какая функция? Это:

func addOne(number: Int) -> Int {
    return 1 + number
}

Смотри строчку return addOne? Это не вызывает функцию, но возвращает ее!

Поэтому, когда вы присваиваете значение makeIncrementer, равное increment:

var increment = makeIncrementer()

increment теперь имеет значение addOne. Вызов increment будет таким же, как и звонок addOne. Вышеуказанная строка синтаксически ничем не отличается от:

var myString = getMyString()

Разница в том, что вы работаете с функциями вместо строк.

Теперь вы понимаете, почему increment(7) равно 8.

Если вы хотите больше сжигать свой мозг, попробуйте поискать функции карри.

0 голосов
/ 16 сентября 2018

makeIncrementer возвращает функцию, которая принимает Int и возвращает Int, поэтому эта

var increment = makeIncrementer()

делает переменную increment равной

func addOne(number: Int) -> Int {
  return 1 + number
}

so increment(7) = addOne(7)

Вы можете прочитать Функции главу в книге Swift

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