Замыкания в Swift, или как использовать Closures

Пример класса, у которого свойства — функции. Кстати, первое свойство опционально, второе — нет, просто замыкание пустое.

class Grapher {
    var yForX: ((Double) -> Double?)?
    var action: () -> Void = {}
}

При установке замыканий в эти свойства нужно не забыть о циклической ссылке: от класса к замыканию, и от замыкания к классу. При таком раскладе класс и замыкание никогда не будут удалены из памяти, что приведет к ее потере. Для решения проблемы утечки памяти нужно указать, что мы не хотим иметь  указатель на класс из замыкания директивой [unowned self]. Ее можно рассмотреть как опциональный указатель на self. Однако, [unowned self] гарантирует что во время жизни замыкания, указатель на self будет не nil.

var formula: ((Double) -> Double?)?  

@IBOutlet weak var grapgView: GraphView!{
    didSet{
          grapgView.grapher.yForX = { [unowned self] (x: Double) -> Double? in
          return self.formula?(x)
          }
    }
}

1 Comment on “Замыкания в Swift, или как использовать Closures

Добавить комментарий

Ваш адрес email не будет опубликован.

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.