Реализуются ли замыкания как классы в компиляторе Swift? Является ли общее замыкание подклассом броска замыкания? - PullRequest
0 голосов
/ 11 сентября 2018

В 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 })
...