【问题标题】:Swift error: Could not find an overload for '-' that accepts the supplied argumentsSwift 错误:找不到接受提供的参数的“-”的重载
【发布时间】:2015-11-23 02:26:25
【问题描述】:

我正在尝试将现有的 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)

我仍然遇到同样的错误。

我做错了什么?

非常感谢。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    类型推断正在生成所有常量声明和Int 类型的循环计数器变量,因为您使用的是Int 文字。你不能天生就用 IntDoubleCGFloat 等混合类型进行数学运算。此外,您最终会尝试创建 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)
                }
            }
        }
    }
    

    【讨论】:

    • 您的 x 和 y 值也会导致问题。试试 CGFloat(x) 和 CGFloat(y)。
    • 没有。这不会改变任何事情。
    • 帮我修好了。我将更新答案中的代码,以便您可以复制粘贴并了解我的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多