Swift Compiler error: 'Double' is not convertible to CGFloat
Asked Answered
S

3

30

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 enter image description here

Spec answered 30/7, 2014 at 2:54 Comment(3)
Which line does the error appear on? Click on the error on the left in the screenshot you posted and it'll take you to the line with the error.Quiff
line 23: let action = SKAction.rotateByAngle(M_PI, duration:1)Spec
This question will be outdated in Swift 5.5.Terrance
R
49

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)
Rude answered 30/7, 2014 at 4:44 Comment(2)
Why there is no implicit casting (in terms of design decision of a language)? In Java, I can pass in Integer (wrapper) where int (underlying type) is expected. This should be harmless since Swift does not need to be compatible with C.Impersonate
Swift is very big on preventing accidents. If you weren't aware you were casting you might be surprised further down the line.Ebenezer
W
0

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

Whisenhunt answered 7/8, 2016 at 4:36 Comment(0)
E
-2

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

Ermentrude answered 30/7, 2014 at 3:17 Comment(3)
what does "add a cast" mean? care to elaborate? might be helpful for othersPrincipe
Cast: aDouble as CGFloatErmentrude
If you are running on a 64 bit iOS, Double still isn't convertible to CGFloat without calling the CGFloat constructor...Demurral

© 2022 - 2024 — McMap. All rights reserved.