функция swift () -> (Int) -> String - PullRequest
0 голосов
/ 02 июня 2018

с учетом следующей функции:

func returnFunc() -> (Int) -> String {
    func innerFunc(i: Int) -> String {
        return " value returned : \(i)"
    }
    return innerFunc
}

returnFunc()    // (Int) -> String -- (correct)
returnFunc()(5) // 'value returned: 5'

почему мне нужно предоставить (), а затем (5), чтобы получить этот результат?

Мне нужно понять, как значение 5 присваивается аргументу "i" в innerFunc

Я буду очень признателен за любой указатель, который объясняет эту функцию.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

returnFunc - это функция curry , тип которой также можно записать как func returnFunc() -> ((Int) -> String), поскольку на самом деле это функция, которая не принимает входных аргументов и возвращает другую функцию, которая принимает один входной аргументвведите Int и вернет String.

Так что, вызывая returnFunc(), вы просто возвращаете функцию, а именно innerFunc, но вам необходимо передать входной аргумент innerFunc, чтобы иметь возможностьвыполнить это.Это делается с помощью (5) в конце returnFunc()(5).

Становится понятнее, если вы напишите это в следующих шагах:

let innerFunc = returnFunc()
let fiveString = innerFunc(5) // "value returned: 5"
0 голосов
/ 02 июня 2018

Это потому, что returnFunc() создает новый экземпляр функции, которая принимает целое число и возвращает строку.

returnFunc()(5) также вызывает функцию и передает 5 в качестве аргумента этой возвращаемой функции, из-за того, как они связаны друг с другом.

Это немного похоже на то, что если функция вернула массив, вы бы получили доступ к элементу массива с помощью:

func returnArray() -> [Int] {
    return [0, 1, 2, 3, 4]
}

returnArray()[2] // This evaluates to 2
0 голосов
/ 02 июня 2018

Поскольку возвращение returnFunc является функцией, которая означает

returnFunc() = innerFunc 

, поэтому это

returnFunc()(5)

означает

innerFunc(5)
...