В Swift единственным справочным типом, доступным программисту, является class
.Мы знаем, что замыкания являются объектами, поскольку они хранят ссылки на переменные, захваченные в родительской области видимости.Замыкания также являются ссылочными типами, в соответствии с Руководством Apple по программированию языка Swift .Вы можете видеть, что назначение замыкания не создает копию захваченной среды и создает новую ссылку на существующую среду, как в этом примере:
func test1() {
var x = 42
let f = {
print(x)
}
f() // prints 42
// `g` stores a reference to `f`
let g = f
x = 24
g() // prints 24
}
Реализуются ли замыкания в компиляторе Swift с аналогичным«инфраструктура» используется для реализации классов?Есть ли код во внутренних компонентах компилятора, скрытый от пользователей языка, который мог бы выглядеть таким образом при отображении?
// pseudocode
final class Closure<ArgumentType, ReturnType> {
}
typealias ArgumentType -> ReturnType = Closure<ArgumentType, ReturnType>
Если так, есть ли отдельный метод для создания замыканий, который выглядит следующим образом?
// pseudocode
final class ThrowingClosure<ArgumentType, ReturnType> {
}
typealias ArgumentType throws -> ReturnType = Closure<ArgumentType, ReturnType>
Главный вопрос здесь заключается в том, можем ли мы считать общее замыкание подклассом броска замыкания?Потому что ясно, что вы можете назначить общее закрытие для любого места, которое ожидает тип броска закрытия:
func test(f: () throws -> Int, g: () -> Int) {
print((try? f())!)
print((try? g())!)
}
// prints 4 and 2
test(f: { 4 }, g: { 2 })