Подтвердить что ты не робот

Ошибка Swift компилятора: "Double" не конвертируется в CGFloat

Я только начал изучать Свифта. Я создал игровой проект и придумал шаблон. Я ничего не сделал с кодом. Я попытался запустить проект, но возникла ошибка компилятора.

Я ухожу из учебника, так что это может быть что-то не так с моей средой, или книга уже устарела.

Ошибка Swift компилятора: "Двойной" не конвертируется в 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 */
    }
}

Ошибка возникает в let action = SKAction.rotateByAngle(M_PI, duration:1)

Вот скриншот настроек проекта enter image description here

4b9b3361

Ответ 1

Вы можете преобразовать его с помощью CGFloat(M_PI).

Например, следующий код должен работать в вашем случае (обратите внимание на использование CGFloat)

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

Ответ 2

Вы можете объявить pi как это в вашем коде: let π = CGFloat(M_PI), а затем использовать let action = SKAction.rotateByAngle(π, duration:1)

Если вы собираетесь использовать π много, это будет проще.

Вы можете ввести π с ярлыком alt + p

Ответ 3

Старый M_PI был Double, но функция ожидала CGFloat. Решением будет актерский состав.

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

Что касается Swift 5, то было бы сейчас:

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

Не нужно больше разыгрывать