Как предотвратить сбой при нажатии на узел - PullRequest
0 голосов
/ 15 мая 2019

Код, который я пишу, имеет проблему, когда всякий раз, когда я нажимаю где-то, кроме узла (например, фон), приложение завершается сбоем.

Я пытался сделать оператор if, но он говоритЯ не могу снизить SKnode до более необязательного типа SKSpriteNode.Я также пытался if node.contains(position of touch).

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    if let touchLocation = touch?.location(in: self) {
    let selectedNode = nodes(at: touchLocation)[0] as! SKSpriteNode

        activeObject = selectedNode
        storedData = Array(activeObject.name!)
        let platformStoredInt = storedData[2]
        storedPlatform = Int(platformStoredInt.unicodeScalars.first!.value - Unicode.Scalar("0")!.value)

        }
    }

Нажатие на что-либо, кроме узлов SKSpriteNode, которые считаются объектами, приводит к SIGABRT.

1 Ответ

0 голосов
/ 15 мая 2019

Приложение вылетает из-за принудительного развертывания значения в этой строке:

let selectedNode = nodes(at: touchLocation)[0] as! SKSpriteNode

Поэтому вместо этого используйте:

if let selectedNode = nodes(at: touchLocation)[0] as? SKSpriteNode {

  activeObject = selectedNode
  storedData = Array(activeObject.name!)
  let platformStoredInt = storedData[2]
   storedPlatform = Int(platformStoredInt.unicodeScalars.first!.value - Unicode.Scalar("0")!.value)

}

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

Необязательное сцепление - это процесс для запроса и вызова свойств, методов и подписок для необязательного элемента, который в настоящее время может быть равен нулю.

...