В Swift, насколько я понимаю, замыкания сохраняют свое окружение, а обычные функции - нет.

Рассмотрим f (возврат функции) и h (возврат замыкания) ниже. И f()(), и h()() возвращают 3. Почему f()() не вызывает ошибки выполнения?

func f() -> () -> Int { 
    let a = 3
    func g() -> Int { 
        return a
    } 
    return g 
} 

func h() -> () -> Int {
    let a = 3
    return { () in a }
}
3
Danyal Aytekin 3 Фев 2015 в 13:37

2 ответа

Лучший ответ

То, что вы написали, не совсем верно, потому что согласно документации :

Глобальные функции - это замыкания, которые имеют имя и не фиксируют никаких значений.

Вложенные функции - это замыкания, которые имеют имя и могут захватывать значения из своей включающей функции.

Выражения замыкания - это безымянные замыкания, написанные в упрощенном синтаксисе, который может захватывать значения из окружающего их контекста.

Song () для захвата значений.

6
Community 20 Июн 2020 в 09:12

Встроенная функция, такая как g, сохраняет контекст. На самом деле функции называются замыканиями, или замыкания являются безымянными функциями (какое бы определение вы ни выбрали).

Как указано в документации:

Глобальные и вложенные функции, представленные в разделе "Функции", на самом деле являются частными случаями замыканий.

1
Antonio 3 Фев 2015 в 10:41