Зачем использовать «неизвестный» в UIViewPropertyAnimator

Итак, я немного почитал об UIViewPropertyAnimator, и в примерах, которые я рассматривал, они делают что-то вроде этого:

animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations: { 
        [unowned self, redBox] in
        redBox.center.x = self.view.frame.width
        redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
    })

Я не понимаю часть «[unowned self, redBox] in». Кто-нибудь может объяснить, для чего мы его используем?

Я знаю, что unowned обычно используется для определения того, как определяется счетчик ссылок, и что его нельзя установить равным нулю, поскольку ссылки не будут существовать одна без другой (в качестве альтернативы слабой), но я не понимаю использование здесь, и я не понимаю часть скобки. Мне кажется, что это массив элементов, которые я анимирую, и вид, в котором он находится?

Полный код выглядит следующим образом:

import UIKit

class ViewController: UIViewController {

    var animator: UIViewPropertyAnimator!

    override func viewDidLoad() {
        super.viewDidLoad()

        //redBox

        let redBox = UIView(frame: CGRect(x: 10, y: 100, width: 100, height: 100))
        redBox.translatesAutoresizingMaskIntoConstraints = false// lar oss redigere posisjon og sånn selv, uten at xcode setter posisjon/størrelse i stein.
        redBox.backgroundColor = .red
        redBox.center.y = view.center.y

        view.addSubview(redBox)

        animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeInOut, animations: { 
            [unowned self, redBox] in
            redBox.center.x = self.view.frame.width
            redBox.transform = CGAffineTransform(rotationAngle: CGFloat.pi).scaledBy(x: 0.001, y: 0.001)
        })

        // slider

        let slider = UISlider()
        slider.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(slider)
        slider.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        slider.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        slider.addTarget(self, action: #selector(sliderChanged), for: .valueChanged)

    }
    func sliderChanged(_ sender: UISlider){
        animator.fractionComplete = CGFloat(sender.value)
    }

}

person Lord Fresh    schedule 16.12.2016    source источник


Ответы (1)


  1. Нам нужно использовать либо weak, либо unowned, иначе будет создан цикл владения (ссылка) (self => animator => animations => self).

  2. Мы можем использовать unowned вместо weak, потому что мы можем быть уверены, что self и animator будут уничтожены вместе, и когда self освободится, анимация больше не будет выполняться.

person Sulthan    schedule 16.12.2016
comment
Окей круто спасибо! Вы также знаете, что это за часть?: [unowned self, redBox] это просто какой-то обработчик завершения с массивом экземпляров, с которыми мы работаем? - person Lord Fresh; 16.12.2016
comment
@LordFresh Это не массив, он называется capture list. См. developer.apple.com/library/content/documentation/Swift/ - person Sulthan; 16.12.2016