2016-07-30 1 views
0

Im получение ошибки на 4-й строке кода Я прикрепил изображение к этому вопросу, которое должно объяснить все, что, вероятно, является быстрым решением, но я никогда не видел его.Ошибка «Невозможно преобразовать значение» на enumerateChildNodesUsingBlock call

enter image description here

Код:

 let GuyScene = SCNScene(named: "art.scnassets/TestMan1.scn") 
    let Guy: SCNNode = GuyScene!.rootNode.childNodeWithName("Man", recursively: true)! 
    let collisionCapsuleRadius2 = CGFloat(0.1) 
    let collisionCapsuleHeight2 = CGFloat(0.1) 
    Guy.position = SCNVector3(x: -30.0, y: 30.0, z: 0.0) 
    Guy.scale = SCNVector3Make(5, 5, 5) 
    Guy.rotation = SCNVector4Make(0, 1, 0, 1) 
    //----Giveing it a physics--------- 
    Guy.physicsBody = SCNPhysicsBody(type: .Dynamic, shape:SCNPhysicsShape(geometry: SCNCapsule(capRadius: collisionCapsuleRadius2, height: collisionCapsuleHeight2), options:nil)) 
    Guy.physicsBody?.affectedByGravity = true 
    Guy.physicsBody?.friction = 0 // 
    Guy.physicsBody?.restitution = 1 //bounceness of the object 
    Guy.physicsBody?.angularDamping = 1 // rotationess 
    Guy.physicsBody?.mass = 1 
    Guy.physicsBody?.rollingFriction = 0 

    GuyScene!.rootNode.addChildNode(Guy) 
    scnView.scene!.rootNode.addChildNode(Guy) 


    func loadAnimationFromSceneNamed(path: String) -> CAAnimation { 
     var scene: SCNScene = SCNScene(named: path)! 
     var animation: CAAnimation? = nil 
     scene.rootNode.enumerateChildNodesUsingBlock({(child: SCNNode, stop: Bool) -> Void in 
      if child.animationKeys.count > 0 { 
       animation = child(animationForKey: child.animationKeys[0]) 
       stop = true 
      } 
     }) 
     return animation! 
    } 

    var scenePath: String = "art.scnassets/Animation1.scn" 


    var thisAnimation: CAAnimation = loadAnimationFromSceneNamed(scenePath) 

    var timer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: "Start", userInfo: nil, repeats: true) 

    func Start() { 
     Guy.addAnimation(thisAnimation, forKey: "thisAnimationKey") 
    } 

Ниже картина ошибок, которые я получаю, когда я делаю предлагаемые ответы на этот вопрос

enter image description here

Extra АргументЪ ??? Благодаря почти там лол

enter image description here

+0

См [это Q & A] (http://stackoverflow.com/questions/24213436/how-to-use-enumeratechildnodeswithname- с-swift-in-spritekit) - просто отбросьте явные аннотации типа из закрытия, а затем используйте 'stop.memory = true', чтобы остановить перечисление. – Hamish

+0

Ok Но знаю, что я получаю ошибку на self.enumrateChildNodesWithName. для замены я использовал «Guy», «GuyScene! .rootNode», «scnView.scene!» Я обновил вопрос –

+0

Не используйте 'enumerateChildNodesWithName', используйте' enumerateChildNodesUsingBlock' - я просто привязывался к этому Q & A как пример того, как вводить замыкание (это код SpriteKit, а не SceneKit). – Hamish

ответ

0

Самый простой способ решить эту проблему, просто отбросить явные аннотации типа и пусть Swift вывести их для вас:

scene.rootNode.enumerateChildNodesUsingBlock({child, stop in 

    // ... 

    // to stop the enumeration (as stop is an UnsafeMutablePointer to an ObjCBool) 
    stop.memory = true 
}) 

Вы также можете использовать trailing closure syntax сделать вызов выглядеть немного аккуратнее:

scene.rootNode.enumerateChildNodesUsingBlock {child, stop in 
    // ... 
} 
+0

Небольшой вопрос/ошибка Я получаю –

+0

animation = child (animationForKey: child.animationKeys [0]) Can not значение вызова не-функционального типа «SCNNode». Его судейство к «ребенку» сразу после знака равенства –

+0

Если я могу исправить это, тогда я должен быть хорошим –

Смежные вопросы