2016-01-20 4 views
3
// function 1------- Currying 
    func increment (incrementBy x: Int)(y: Int) -> Int { 
     return x + y 
    } 

// function 2------- The function that return a function 
    func increment(incrementBy x: Int) -> ((Int) ->Int){ 
     func incrementFunc(y: Int){ 
      return x + y 
     } 
    } 

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

let incrementFunc = increment(incrementBy: 10) 
var number = 10 
number = incrementFunc(number) 

Итак, я смущен, в чем их отличие? В чем преимущества каждого способа?

+0

Просто примечание стороны выделка, скорее всего, будет удален в следующей версии Swift. – boidkan

ответ

5

Первый пример у вас есть «синтаксический сахар» для второго, аналогичным образом, что [Int] является сокращением для Array<Int>. Они означают одно и то же и действуют одинаково.

Однако, я должен указать, что этот синтаксический сахар скоро исчезнет. This proposal, написанный инженером-компилятором Swift и принятый командой разработчиков Swift, говорит, что синтаксис сокращенного currying больше не будет частью языка. Вместо этого все currying будет сделано так, как ваш второй пример написан.

+1

В основном, первый (синтаксический сахар) говорит: «Свифт, пожалуйста, карри эту функцию для меня». – matt

1

Первая функция 2 должна быть:

func increment(incrementBy x: Int) -> ((Int) ->Int){ 
    func incrementFunc(y: Int) -> Int { 
     return x + y 
    } 
    return incrementFunc 
} 

В этом случае функция 1 & 2 делать то же самое. Первый немного короче. Второй, по-видимому, более ясен в своем намерении.

Вы также можете нам функция 3, которая короче и ясно:

func increment(incrementBy x: Int) -> ((Int) ->Int){ 
    return { y in return x + y } 
} 

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

  • Нет связанных вопросов^_^