Поиск…


Вступление

Из Swift Documentarion

Говорят, что замыкание выходит из функции, когда замыкание передается как аргумент функции, но вызывается после возвращения функции. Когда вы объявляете функцию, которая принимает замыкание как один из ее параметров, вы можете написать @escaping перед типом параметра, чтобы указать, что закрытие разрешено.

Неэкранирующее закрытие

В Swift 1 и 2 по умолчанию закрываются параметры закрытия. Если вы знали, что ваше закрытие не ускользнет от тела функции, вы можете пометить параметр атрибутом @noescape.

В Swift 3 это наоборот: параметры закрытия по умолчанию не экранируются. Если вы намерены избежать этой функции, вы должны пометить ее атрибутом @escaping.

class ClassOne {
  // @noescape is applied here as default
  func methodOne(completion: () -> Void) {
    // 
  }
}

class ClassTwo {
  let obj = ClassOne()
  var greeting = "Hello, World!"

  func methodTwo() {
    obj.methodOne() {
      // self.greeting is required
      print(greeting)
    }
  }
}

Закрытие крышки

Из Swift Documentarion

@escaping

Примените этот атрибут к типу параметра в объявлении метода или функции, чтобы указать, что значение параметра может быть сохранено для последующего выполнения. Это означает, что значение позволяет пережить время жизни вызова. Параметры типа функции с атрибутом типа escaping требуют явного использования self. для свойств или методов.

class ClassThree {

    var closure: (() -> ())?

    func doSomething(completion: @escaping () -> ()) {
        closure = finishBlock
    }
}

В приведенном выше примере блок завершения сохраняется в закрытии и будет буквально жить вне вызова функции. Таким образом, complier заставит отмечать блок завершения как @ escaping.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow