简体   繁体   中英

Swift Compiler error: 'Double' is not convertible to CGFloat

I just began learning Swift. I created a game project and a template came up. I have not done anything to the code whatsoever. I tried to run the project but a compiler error popped up.

I'm going off a tutorial so it could be something wrong with my environment or the book is already outdated.

Swift Compiler error: 'Double' is not convertible to CGFloat

import SpriteKit

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
        myLabel.text = "Hello, World!";
        myLabel.fontSize = 65;
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

        self.addChild(myLabel)
    }

    override func mouseDown(theEvent: NSEvent) {
        /* Called when a mouse click occurs */

        let location = theEvent.locationInNode(self)

        let sprite = SKSpriteNode(imageNamed:"Spaceship")
        sprite.position = location;
        sprite.setScale(0.5)

        let action = SKAction.rotateByAngle(M_PI, duration:1)
        sprite.runAction(SKAction.repeatActionForever(action))

        self.addChild(sprite)
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

The error occurs in let action = SKAction.rotateByAngle(M_PI, duration:1)

Here is a screenshot of the project settings 在此输入图像描述

You can convert it with CGFloat(M_PI) .

For example the following code should work in your case (note the use of CGFloat )

let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)

You can declare pi like this in your code : let π = CGFloat(M_PI) and then use let action = SKAction.rotateByAngle(π, duration:1)

If you are going to use π a lot, it's way more simple.

You can type π with the shortcut alt+p

The old M_PI was a Double, but the function did expect a CGFloat. A cast would be the solution.

let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)

With respect to Swift 5 it would be now:

let action = SKAction.rotate(byAngle: .pi, duration:1)

No need to cast anymore

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM