“Expression is not assignable” — Problem assigning float as sum of two other floats in Xcode?

后端 未结 5 888
北恋
北恋 2020-11-30 04:47

In a piano app, I\'m assigning the coordinates of the black keys. Here is the line of code causing the error.

\'blackKey\' and \'whiteKey\' are both customViews

相关标签:
5条回答
  • 2020-11-30 05:00

    One alternative using macros:

    #define CGPOINT_SETX(point, x_value) { \
        CGPoint tempPoint = point;         \
        tempPoint.x = (x_value);           \
        point = tempPoint;                 \
    }
    
    #define CGPOINT_SETY(point, y_value) { \
        CGPoint tempPoint = point;         \
        tempPoint.y = (y_value);           \
        point = tempPoint;                 \
    }
    
    CGPOINT_SETX(blackKey.center, whiteKey.frame.origin.x + whiteKey.frame.size.width);
    

    or slightly simpler:

    CGPOINT_SETX(blackKey.center, CGRectGetMaxX(whiteKey.frame));
    
    0 讨论(0)
  • 2020-11-30 05:05

    As its meanings, you can't assign value to expression. For instance, a + b = c it is forbidden.

    0 讨论(0)
  • 2020-11-30 05:08
    blackKey.center = CGPointMake ( whiteKey.frame.origin.x + whiteKey.frame.size.width, blackKey.center.y);
    

    One way of doing it.

    0 讨论(0)
  • 2020-11-30 05:11

    You can not directly change the x value of a CGPoint(or any value of a struct) like that, if it is an property of an object. Do something like the following.

    CGPoint _center = blackKey.center;
    _center.x =  (whiteKey.frame.origin.x + whiteKey.frame.size.width);
    blackKey.center = _center;
    
    0 讨论(0)
  • 2020-11-30 05:18

    The other answers don't exactly explain what's going on here, so this is the basic problem:

    When you write blackKey.center.x, the blackKey.center and center.x both look like struct member accesses, but they're actually completely different things. blackKey.center is a property access, which desugars to something like [blackKey center], which in turn desugars to something like objc_msgSend(blackKey, @selector(center)). You can't modify the return value of a function, like objc_msgSend(blackKey, @selector(center)).x = 2 — it just isn't meaningful, because the return value isn't stored anywhere meaningful.

    So if you want to modify the struct, you have to store the return value of the property in a variable, modify the variable, and then set the property to the new value.

    0 讨论(0)
提交回复
热议问题