Переменные Swift в выражении Switch или If - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь научиться использовать Swift, и я только в начале. Так что этот код, вероятно, очень плохой. Я не могу найти некоторую информацию об обработке var в операторах switch.

В приложении для iOS вы можете перетащить черный вид (imgView) вдоль экрана. Теперь, если касание заканчивается, imgView должен анимироваться в CGPoint, который рассчитывается от начальной и конечной точек жеста панорамирования.

@objc func handlePan(recognizer: UIPanGestureRecognizer) {

    var locationOfBeganTap  = CGPoint()
    var locationOfEndTap = CGPoint()
    let finalDestination = CGPoint(x: (locationOfBeganTap.x  + locationOfEndTap.x), y: locationOfBeganTap.y  + locationOfEndTap.y)


    switch recognizer.state {

    case .changed, .began:

        locationOfBeganTap = recognizer.location(in: screenView)
        print(locationOfBeganTap)

        let translation = recognizer.translation(in: self.view)
        if let view = recognizer.view {
            view.center = CGPoint(x: view.center.x + translation.x, y: view.center.y + translation.y)
        }
        recognizer.setTranslation(CGPoint.zero, in: self.view)

    case .ended:

        locationOfEndTap = recognizer.location(in: screenView)

        UIView.animate(withDuration: 2.0, animations: {
            print(locationOfBeganTap)

            self.imgView.center = finalDestination
        })

    default:
        break
    }

Я хочу знать, почему переменная locationOfBeginTap правильно установлена ​​в .began, но далее в операторе Switch переменная снова устанавливается в 0. Когда и почему это изменилось? И как мне этого избежать?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Переместите ваши переменные за пределы метода.

var locationOfBeganTap  = CGPoint()
var locationOfEndTap = CGPoint()
let finalDestination = CGPoint(x: (locationOfBeganTap.x  + locationOfEndTap.x), y: locationOfBeganTap.y  + locationOfEndTap.y)

@objc func handlePan(recognizer: UIPanGestureRecognizer) {

    switch recognizer.state {

    case .changed, .began:

        locationOfBeganTap = recognizer.location(in: screenView)
        print(locationOfBeganTap)

        let translation = recognizer.translation(in: self.view)
        if let view = recognizer.view {
            view.center = CGPoint(x: view.center.x + translation.x, y: view.center.y + translation.y)
        }
        recognizer.setTranslation(CGPoint.zero, in: self.view)

    case .ended:

        locationOfEndTap = recognizer.location(in: screenView)

        UIView.animate(withDuration: 2.0, animations: {
            print(locationOfBeganTap)

            self.imgView.center = finalDestination
        })

    default:
        break
    }
}
0 голосов
/ 08 ноября 2018

Это все о переменной области видимости. Это не имеет ничего общего с switch или if. Каждый раз, когда вызывается handlePan, вы создаете новые локальные переменные с их начальными значениями.

Переместите объявление этих переменных за пределы функции, чтобы они фактически были свойствами вашего класса. Тогда значения останутся между вызовами на handlePan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...