我正在尝试将现有的Objective-C代码行转换为Swift。 以下是我所拥有的。
import UIKit import SpriteKit let kWorldWidth = 6324 let kWorldHeight = 620 let kWorldTileSize = 62 let kWorldCenterX = 3162 let kWorldCenterY = 310 class ViewController: UIViewController { weak var scene : SKScene? var backgroundTextures = NSMutableArray() override func viewDidLoad() { super.viewDidLoad() loadWorldTiles() } func loadWorldTiles() { let tileAtlas = SKTextureAtlas(named:"Tiles") backgroundTextures = NSMutableArray(capacity: 1020) for var y = 0; y < 10; y++ { for var x = 0; x < 102; x++ { let tileNumber = (y * 102) + x let tileNode = SKSpriteNode(texture:tileAtlas.textureNamed(String(format:"%d",tileNumber))) var position: CGPoint = CGPointMake(x*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize,kWorldHeight-y*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize) tileNode.position = position backgroundTextures.addObject(tileNode) } } } }我得到一个错误,我有var位置。 错误消息是找不到接受提供的参数的' - '的重载。 运行搜索时,我发现当您没有显式声明变量类型时,您将收到此错误。 如果我创建整数变量,如
var xval:CGFloat = x*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize var yval:CGFloat = kWorldHeight-y*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize var position: CGPoint = CGPointMake(xval,yval)我仍然得到同样的错误。
我究竟做错了什么?
Muchos thankos。
I'm trying to translate existing lines of Objective-C code into Swift. The following is what I have.
import UIKit import SpriteKit let kWorldWidth = 6324 let kWorldHeight = 620 let kWorldTileSize = 62 let kWorldCenterX = 3162 let kWorldCenterY = 310 class ViewController: UIViewController { weak var scene : SKScene? var backgroundTextures = NSMutableArray() override func viewDidLoad() { super.viewDidLoad() loadWorldTiles() } func loadWorldTiles() { let tileAtlas = SKTextureAtlas(named:"Tiles") backgroundTextures = NSMutableArray(capacity: 1020) for var y = 0; y < 10; y++ { for var x = 0; x < 102; x++ { let tileNumber = (y * 102) + x let tileNode = SKSpriteNode(texture:tileAtlas.textureNamed(String(format:"%d",tileNumber))) var position: CGPoint = CGPointMake(x*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize,kWorldHeight-y*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize) tileNode.position = position backgroundTextures.addObject(tileNode) } } } }I get an error where I have var position. The error message is Could not find an overload for '-' that accepts the supplied arguments. Running a search, I find that you will get this error when you don't explicitly declare variable types. If I create integer variables like
var xval:CGFloat = x*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize var yval:CGFloat = kWorldHeight-y*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize var position: CGPoint = CGPointMake(xval,yval)I still get the same error.
What am I doing wrong?
Muchos thankos.
最满意答案
类型推断正在进行所有常量声明和Int类型的循环计数器变量,因为您使用的是Int文字。 你不能固有地使用Int , Double和CGFloat等混合类型进行数学运算。 此外,您最终尝试创建CGFloat类型,因此最好明确地为您的常量使用它,如下所示:
import UIKit import SpriteKit let kWorldWidth: CGFloat = 6324 let kWorldHeight: CGFloat = 620 let kWorldTileSize: CGFloat = 62 let kWorldCenterX: CGFloat = 3162 let kWorldCenterY: CGFloat = 310 class ViewController: UIViewController { weak var scene : SKScene? var backgroundTextures = NSMutableArray() override func viewDidLoad() { super.viewDidLoad() loadWorldTiles() } func loadWorldTiles() { let tileAtlas = SKTextureAtlas(named:"Tiles") backgroundTextures = NSMutableArray(capacity: 1020) for var y = 0; y < 10; y++ { for var x = 0; x < 102; x++ { let tileNumber = (y * 102) + x let tileNode = SKSpriteNode(texture:tileAtlas.textureNamed(String(format:"%d",tileNumber))) var position: CGPoint = CGPointMake(CGFloat(x)*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize,kWorldHeight-CGFloat(y)*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize) tileNode.position = position backgroundTextures.addObject(tileNode) } } } }Type inference is making all your constant declarations and for loop counter variables of type Int, since you are using Int literals. You cannot inherently do math with mixed types like Int, Double, and CGFloat. Also, you are ultimately trying to create a CGFloat type, so it's best to use that explicitly for your constants like so:
import UIKit import SpriteKit let kWorldWidth: CGFloat = 6324 let kWorldHeight: CGFloat = 620 let kWorldTileSize: CGFloat = 62 let kWorldCenterX: CGFloat = 3162 let kWorldCenterY: CGFloat = 310 class ViewController: UIViewController { weak var scene : SKScene? var backgroundTextures = NSMutableArray() override func viewDidLoad() { super.viewDidLoad() loadWorldTiles() } func loadWorldTiles() { let tileAtlas = SKTextureAtlas(named:"Tiles") backgroundTextures = NSMutableArray(capacity: 1020) for var y = 0; y < 10; y++ { for var x = 0; x < 102; x++ { let tileNumber = (y * 102) + x let tileNode = SKSpriteNode(texture:tileAtlas.textureNamed(String(format:"%d",tileNumber))) var position: CGPoint = CGPointMake(CGFloat(x)*kWorldTileSize-kWorldCenterX+0.5*kWorldTileSize,kWorldHeight-CGFloat(y)*kWorldTileSize-kWorldCenterY-0.5*kWorldTileSize) tileNode.position = position backgroundTextures.addObject(tileNode) } } } }更多推荐
发布评论