"CGFloat" does not convert to "Float" and more

I have more problems in my application. My mistakes, as the title says:

  • Swift compiler error.

Error1: "CGFloat" does not convert to "Float"

Code for the first and second errors:

self.setPositionRelativeBot(pipeBot, x: xx, y: offset) self.setPositionRelativeTop(pipeTop, x: xx, y: offset + space) 

Here is the whole func:

 func spawnPipeRow(offs: Float) { let offset = offs - space / 2 let pipeBot = mainPipe.copy() as Pipe let pipeTop = mainPipe.copy() as Pipe pipeBot.texture = SKTexture(imageNamed: "BotPipe") pipeTop.texture = SKTexture(imageNamed: "TopPipe") pipeBot.texture!.filteringMode = SKTextureFilteringMode.Nearest pipeTop.texture!.filteringMode = SKTextureFilteringMode.Nearest pipeBot.isBottom = true let xx = self.view!.bounds.size.width self.setPositionRelativeBot(pipeBot, x: xx, y: offset) self.setPositionRelativeTop(pipeTop, x: xx, y: offset + space) pipeBot.physicsBody = SKPhysicsBody(rectangleOfSize: pipeBot.size) pipeTop.physicsBody = SKPhysicsBody(rectangleOfSize: pipeTop.size) pipeBot.physicsBody!.dynamic = false pipeTop.physicsBody!.dynamic = false pipeBot.physicsBody!.contactTestBitMask = birdCategory pipeTop.physicsBody!.contactTestBitMask = birdCategory pipeBot.physicsBody!.collisionBitMask = birdCategory pipeTop.physicsBody!.collisionBitMask = birdCategory pipes.append(pipeBot) pipes.append(pipeTop) self.addChild(pipeBot) self.addChild(pipeTop) } 

  1. Swift compiler error.

Error1: "Float" is not identical to "UInt8"

Code for the first error:

 vel -= 85 - (self.view!.bounds.size.height - bird.position.y) 

Error2: "SKPhysicsBody? Does not have a member named 'velocity'

Code for the second error:

 bird.physicsBody.velocity = CGVectorMake(0, vel) 

Here is the whole func:

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { if (!bird.physicsBody!.dynamic) { //First touch self.spawnPipeRow(0) bird.physicsBody!.dynamic = true bird.physicsBody!.velocity = CGVectorMake(0, 175) scoreLabel.hidden = false isMoving = true } else if (isMoving) { var vel: Float = 200 if (self.view!.bounds.size.height - bird.position.y < 85) { vel -= 85 - (self.view!.bounds.size.height - bird.position.y) } bird.physicsBody.velocity = CGVectorMake(0, vel) } else { overlay.removeFromParent() for pi in pipes { pi.removeFromParent() } pipes.removeAll(keepCapacity: false) score = 0 bird.physicsBody!.dynamic = false bird.position = CGPoint(x: 150, y: view!.bounds.size.height / 2 - 10) scoreLabel.hidden = true isGroundMoving = true } } 

  1. Swift compiler error.

Error1: "CGFloat" is not identical to "UInt8"

Code for the first and second errors (same error on both lines):

 ground1.position.x -= movingSpeed ground2.position.x -= movingSpeed 

Error2: Unable to call '- =' using argument list of type '(@lvalue CGFloat, $ T9)'

Code for the third and fourth errors (same error on both lines):

 background1.position.x -= movingSpeed / 3 background2.position.x -= movingSpeed / 3 

Error3: "CGFloat" is not identical to "UInt8"

 pipe.position.x -= movingSpeed 

Here is the whole func:

 override func update(currentTime: CFTimeInterval) { if (isGroundMoving) { ground1.position.x -= movingSpeed ground2.position.x -= movingSpeed if (ground1.position.x <= -self.view!.bounds.size.width / 2) { ground1.position.x = self.view!.bounds.size.width * 1.5 - 2 } if (ground2.position.x <= -self.view!.bounds.size.width / 2) { ground2.position.x = self.view!.bounds.size.width * 1.5 - 2 } background1.position.x -= movingSpeed / 3 background2.position.x -= movingSpeed / 3 if (background1.position.x <= -self.view!.bounds.size.width / 2) { background1.position.x = self.view!.bounds.size.width * 1.5 - 2 } if (background2.position.x <= -self.view!.bounds.size.width / 2) { background2.position.x = self.view!.bounds.size.width * 1.5 - 2 } if (isMoving) { for (var i = 0; i < pipes.count; i++) { let pipe = pipes[i] if (pipe.position.x + (pipe.size.width / 2) < 0) { pipe.removeFromParent() continue } if (pipe.position.x + (pipe.size.width / 2) < self.view!.bounds.size.width / 2 && pipe.isBottom && !pipe.pointAdded) { score++ pipe.pointAdded = true } pipe.position.x -= movingSpeed if (i == pipes.count - 1) { if (pipe.position.x < self.view!.bounds.width - pipe.size.width * 2.0) { self.spawnPipeRow(self.randomOffset()) } } } scoreLabel.text = "Score: \(score)" } } } 

I hope some of you guys can figure this out for me because I can't :)

+6
source share
1 answer

Error 1: use CGFloat instead of Float . For instance:

 var vel: CGFloat = 200 

Error 2: physicalBody is optional (maybe nil), so use the ?. Operator ?. to conditionally expand it before referencing its velocity :

 bird.physicsBody?.velocity = CGVectorMake(0, vel) 

All of your errors seem to be caused by one of these two problems. For example, the spawnPipeRow argument spawnPipeRow again offs: Float instead of CGFloat . And I suspect the same thing applies to values ​​that you did not declare in the fragments you provided, such as space or movingSpeed .

To understand what CGFloat , click on it with a command - this will lead you to the CoreGraphics API, where you can read that CGFloat is a "native type ... which is Float on 32-bit architectures and Double on 64-bit architectures."

Also, would I rather use ? instead ! when modifying physicsBody , since the latter will work if physicsBody is zero.

+5
source

Source: https://habr.com/ru/post/975988/


All Articles