Замыкания в 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) } } }
Спасибо.