2016-05-30 7 views
9

В документации Swift Apple, говорит, что это:Быстрая разница между закрытием и функциями первого класса?

Затворы представляют собой автономные блоки функциональных возможностей, которые могут быть переданы вокруг и используется в вашем коде. Закрытия в Swift аналогичны блокам в C и Objective-C и для лямбда на других языках программирования.

который я думал, было определение First-class functions

И они также говорят, что это:

Затворы могут захватывать и хранить ссылки на любые константы и переменные из контекста, в котором они определены , Это называется , перекрывающим эти константы и переменные. Swift обрабатывает все управление памятью захвата .

Я думал, что это было определением замыканий, в то время как другая функция была предназначена для первоклассных функций, но Apple, похоже, собрала их и называет это закрытием.

Я что-то не понял? или Apple закрывает закрытие и закрывает функции первого класса?

Я написал этот пример кода и просто хочу знать, прав ли я в письменных комментариях?

// 'a' takes a first class function, which makes 'a' a higher order function 
func a(ch:() -> Void){ 
    print("Something") 
    ch()    // 'ch' is a first class function 
    print("Ended") 
} 

func closureFunc(){ 
    var num = 2 
    a({ 
     // access to 'num' is possible by closures 
     num = num*2 
     print(num) 
    }) 
} 

closureFunc() 
+1

Все выглядит хорошо. - затворы могут захватить параметры вне их, в том числе 'self.' (должен быть явным). Взгляните на http://stackoverflow.com/questions/29022985/how-to-comprehend-the-first-class-function-in-swift?rq=1 – sschale

+0

Если вы чувствуете, что ваш вопрос удовлетворен, пожалуйста, примите его ответов – Alexander

ответ

5

Эти понятия ортогональны. Они не связаны напрямую; это два факта о функциях в Свифте.

  • Функции первого класса. Это означает, что они могут быть переданы - назначены как переменные, переданы в параметры функции в качестве аргументов и переданы из функций в виде результатов.

  • Функции закрытие. Это означает, что в точке определения они захватывают окружающую среду, обозначенную внутри тела функции, но объявленной снаружи тело функции.

Ниже приведен пример (с детской площадкой):

func multiplierMaker(i:Int) -> (Int) -> (Int) { 
    func multiplier(ii:Int) -> (Int) { 
     return ii*i 
    } 
    return multiplier 
} 
let g = multiplierMaker(10) 
g(2) // 20 

Подумайте о функции multiplier:

  • Тот факт, что multiplier может быть возвращен в качестве результата функции multiplierMaker и присвоен g и что он имеет четко определенный тип (Int) -> (Int), является то, что функции первоклассный.

  • Тот факт, что, когда 10 передается в multiplierMaker, полученный multiplier функция умножает параметр на 10, даже при присвоении g и назвал позже, потому, что функции замыкания.

(Обратите внимание, что это не имеет ничего общего с анонимными функциями.Все ответы или заявления, заставляющие вас поверить, что закрытие связано с анонимными функциями, неверны. В этом примере анонимных функций нет. Анонимная функция является замыкание, но только потому, что все функции закрытия)

8

первого класса Функция это язык функция, которая позволяет функцию, которая может быть присвоено переменной и передается вокруг, как будто это любой другой вид данных. Закрытия, лямбды и анонимные функции - это «функции первого класса».

Анонимные функции, называемые также Lambda функции, функции, которые не имеют имя (например, как способ a(ch:) имеет имя). Поскольку у них нет имени, единственный способ использовать их - хранить их в переменной или передавать их в качестве аргументов (параметры по существу являются переменными). Таким образом, все анонимные функции также являются функциями первого класса.

Закрытие - это функции первого класса, которые захватывают состояние вокруг них. Они могут быть анонимными или иметь имя. Именованные закрытия - это ваши обычные функции func.

a(ch:) - это функция более высокого порядка, правильно.

ch - функция первого класса (как она хранится в переменной), Лямбда (синоним FCF) и, возможно, также закрытие, в зависимости от того, ссылается ли ее тело на какие-либо внешние переменные.

В случае вызова a(ch:) с этим блоком ch является закрытием, поскольку он захватывает num.

+1

«Закрытие - это анонимные функции» № _ Все функции - это замыкания в Swift. – matt

+0

Это заслуживает ответа! – ospahiu

4

функции могут захватывать переменные в контексте они были объявлены в, и «Сочетание функции и окружения захваченных переменных называется - закрытие» more

Вот простое объяснение замыканий и первых функций класса в Swift:

  1. Функция объекты первого класса, они могут быть отнесены к переменным, они могут быть переданы в качестве аргументов и могут быть возвращены

  2. есть два способа s определяющих функций в Swift: один с использованием ключевого слова func и использование «замыкающих выражений» - (не означает закрытия). например

    func f() { print("nothing") } 
    
    let a = f // cannot use parentheses here 
    
    // or using closure expression: 
    let a = {() -> void in print("nothing") } 
    
  3. И, наконец, прямой ответ на ваш вопрос: Функции могут захватить переменные в контексте они были объявлены в, и «Сочетание функции и окружения захваченных переменных называется - закрытие», например,

    func f() ->()->() 
    { 
        var c = 0 // local var 
    
        func innerf() 
        { 
         c += 1 // c is now captured 
        } 
    
        return innerf 
    } // normally c would be released here. but since its used in innerf(), it will stay 
    
    let f1 = f 
    

    Теперь мы называем f1 закрытием, потому что оно захватывает переменную.

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

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