swiftstringxcodeuikitsktexture

How to get name of object as string in swift 3.0


If my player collides with the drugNode object, I want to change the texture of the animation to the correct image. But I don't know how to get the name of "drugNode". My images are named "pill1", "pill2" and so on

func playerCollide(drugNode: SKSpriteNode, playerNode: SKSpriteNode){
        let animation = SKEmitterNode(fileNamed: "SpecialFallingParticle")!
        animation.position = drugNode.position

        print(String(describing: drugNode.self.name))
        animation.particleTexture = SKTexture(imageNamed: "\(String(describing: drugNode.name))")
        self.addChild(animation)
        self.run(SKAction.playSoundFileNamed("snacked.mp3", waitForCompletion: false))
        drugNode.removeFromParent()
    
        self.run(SKAction.wait(forDuration: 2)){
            animation.removeFromParent()
        }
    }

Output:

Optional("pill18")
2020-06-25 18:32:50.096389+0200 Snacker[5316:292543] SKTexture: Error loading image resource: "Optional("pill18")"
Optional("pill1")
2020-06-25 18:32:51.597661+0200 Snacker[5316:292543] SKTexture: Error loading image resource: "Optional("pill1")"
Optional("pill21")
2020-06-25 18:32:53.097427+0200 Snacker[5316:292543] SKTexture: Error loading image resource: "Optional("pill21")"

Solution

  • The name property of SKSpriteNode returns a String?, an optional String. You need to unwrap that. One option is to use the nil coalescing operator ?? to provide a default value if name has not been set:

    let name = drugNode.name ?? "defaultImage"