Набор не имеет элемента " location"


Часть проекта, над которым я работаю, требует, чтобы я заставлял объект перемещаться с помощью прикосновения. В настоящее время я использую Swift 3.1 и Xcode 8.3.3. 7-я строка дает мне ошибки, говоря:

Значение типа 'Set<UITouch>' не имеет члена 'location'

Но я просмотрел документацию, и она является членом. Есть ли какой-то обходной путь? Мне нужно только переместить изображение на основе касания и перетаскивания.
import UIKit

class ViewController: UIViewController {

var thumbstickLocation = CGPoint(x: 100, y: 100)

@IBOutlet weak var Thumbstick: UIButton!

override func touchesBegan(_ touches:Set<UITouch>, with event: UIEvent?) {
    let lastTouch : UITouch! = touches.first! as UITouch
    thumbstickLocation = touches.location(in: self.view)
    Thumbstick.center = thumbstickLocation

}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    let lastTouch : UITouch! = touches.first! as UITouch
    thumbstickLocation = lastTouch.location(in: self.view)
    Thumbstick.center = thumbstickLocation
}
2 2

2 ответа:

Ошибка компилятора верна, Set<UITouch> не имеет члена location. UITouch имеет свойство location.

На самом деле вам нужно написать thumbstickLocation = lastTouch.location(in: self.view), чтобы переместить объект туда, где начались прикосновения. Вы также можете сделать свой код более сжатым, написав тело обеих функций в одной строке.

В общем случае вы не должны использовать принудительное разворачивание опционов, но с этими двумя функциями вы можете быть уверены, что набор touches будет иметь ровно один элемент (если вы не зададите вид isMultipleTouchEnabled свойство к true, в этом случае оно будет иметь более одного элемента), поэтому touches.first! Никогда не подведет.

class ViewController: UIViewController {

    var thumbstickLocation = CGPoint(x: 100, y: 100)

    @IBOutlet weak var Thumbstick: UIButton!

    override func touchesBegan(_ touches:Set<UITouch>, with event: UIEvent?) {
        Thumbstick.center = touches.first!.location(in: self.view) 
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        Thumbstick.center = touches.first!.location(in: self.view)
    }
}

location действительно не член Set<UITouch>. Вы должны получить доступ к элементу UITouch набора, чтобы получить к нему доступ.

thumbstickLocation = touches.first!.location(in: self.view)

...но лучше получить к нему безопасный доступ с помощью if let или guard let:

if let lastTouch = touches.first {
    thumbstickLocation = lastTouch.location(in: self.view)
    Thumbstick.center = thumbstickLocation
}