二进制运算符 '>= & <=' 不能应用于 CGFloat 和 Int In Swift 类型的操作数



我得到两个错误。当我使用<=和>=时,它会给我错误:

Binary Operator '>= &<='不能应用于CGFloat和Int类型的操作数

 override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    var speedOfTouch = 30
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        if location.x < CGRectGetMidX(self.frame) {
            square.position.x <= speedOfTouch
            square.physicsBody?.applyImpulse(CGVector(dx: -40, dy: 0))

        }
        else {
            square.position.x >= speedOfTouch
            square.physicsBody?.applyImpulse(CGVector(dx: 40, dy: 0))
        }
    }
}

我需要帮助!

改变一行:

let speedOfTouch = CGFLoat(30)

它不起作用,因为你不能比较两种不同的类型,因为编译器声明

swift编译器认为尝试比较两种不同的类型是程序员的错误。

把你的代码改成:

var speedOfTouch = 30 as CGFloat

我认为至少有两个问题。

  1. speedOfTouch具有Int类型,因为您没有指定任何其他类型。因此,在表达式square.position.x <= speedOfTouch中,您试图比较CGFloatInt

    Swift不会自动在数值类型之间进行转换,也没有定义左边取CGFloat,右边取Int<=操作符,所以你不能比较两个不同类型的值。

    你可以解决这个问题,例如,显式地将speedOfTouch声明为CGFloat:

    var speedOfTouch: CGFloat = 30
    
  2. 另一个问题,它不会给你一个编译器错误,是你已经写了square.position.x <= speedOfTouch作为一个语句。您正在比较两个值,但是您没有对比较的结果做任何操作。

    在优化的(发布)版本中,编译器可能会完全消除比较。那你为什么要这么做?

    你可能想对比较的结果做点什么。例如,也许您想这样做:

    if ((location.x < CGRectGetMidX(self.frame))
        && (square.position.x <= speedOfTouch)) {
        square.physicsBody?.applyImpulse(CGVector(dx: -40, dy: 0))
    }
    

最新更新