局部变量更新本身,为什么

时间:2016-11-06 20:51:42

标签: ios swift uiview

我创建了一个UIView组件(在主故事板中占据了整个屏幕)。它链接到的类名为MyFullView,如下所示:

import UIKit

    class MyFullView: UIView {
        var myTouch: UITouch?

        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            super.touchesBegan(touches, with: event)
            // I only initialized myTouch here.
            myTouch = UITouch()
            myTouch = touches.first
        }

        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
             // I just print out myTouch location, magically the value is updated for each finger movement, why?
             print("myTouch = \(myTouch?.location(in: self))")
             super.touchesMoved(touches, with: event)
       }
    }

我宣布了变量myTouch&amp;在touchesBegan回调中初始化它。我没有任何代码更新myTouch的值。

但是当我在模拟器中运行我的应用程序时,鼠标点击&amp;移动/拖动,我可以看到日志.e.g。:

myTouch = Optional((100.5, 117.0))
myTouch = Optional((99.5, 117.0))
myTouch = Optional((99.0, 117.0))
myTouch = Optional((98.5, 117.0))
myTouch = Optional((98.5, 118.0))
myTouch = Optional((98.0, 118.0))
myTouch = Optional((97.5, 118.0))
...

为什么&amp;怎么地狱myTouch变量更新自身的价值?我不明白,有人可以向我解释一下这个魔法是什么?

2 个答案:

答案 0 :(得分:0)

你的答案在于第二行:

        myTouch = UITouch()
        myTouch = touches.first

您已将myTouch分配给touches中的第一个对象。当您获得触摸事件时,UITouch将成为触摸生命周期的相同实例(直到您完成或取消)。

所以你在touchesMoved看到了触摸的位置更新。

如果您想拥有原始位置,则需要将其存储起来。

请注意,您的代码会出现多点触控问题。

答案 1 :(得分:0)

UITouch是一个类,这意味着当您将变量设置为UITouch时,您将引用另一个UITouch,而不是创建一个新的UITouch。如果这对您来说是一个问题,我会将触摸存储为CGPoint(这是一个结构)。 Alex Wayne's answer很好地描述了类和结构之间的这种差异。