Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setting and using obj-c CGPoint, CGRect, and others

I have three questions surrounding what I think is the topic of structs in obj-c

1) Why is it that I often (or always) cannot take a member var that is a CGPoint or a CGRect and set the values one by one? I find I have to do:

CGPoint point;
point.x = someValue;
point.y = someOtherValue;
obj.myPoint = point;

instead of simply obj.myPoint.x = someValue etc.

2) Is this behavior that is consistent across all structs in obj-c?

3) Is there an easy way to add two CGPoints? It seems like there should already be, but I couldn't find one. I thought it'd be cumbersome if I'd have to use a temporary CGPoint to accumulate values between two CGPoints before setting the dest var to the temp var (because of not being able to just do pointA.x += pointB.x (same for y).

like image 981
Joey Avatar asked Nov 21 '10 05:11

Joey


1 Answers

1) From @sb in an answer to Cocoa Objective-c Property C structure assign fails

That won't accomplish anything, because [t member] returns a struct, which is an "r-value", ie. a value that's only valid for use on the right-hand side of an assignment. It has a value, but it's meaningless to try to change that value.

Basically you just have to live with the fact that you can't set the fields of struct directly when returned from a function.

2) Yes

3) Unfortunately I don't think there is a built-in convenience method for adding two CGPoint. If you find your self doing this frequently you can make your own:

CGPoint CGPointAdd(CGPoint p1, CGPoint p2)
{
    return CGPointMake(p1.x + p2.x, p1.y + p2.y);
}  

and then use it like:

obj.pointA = CGPointAdd(obj.pointA, pointB);

not as elegant as obj.pointA.X += ... but sometimes life isn't fair.

like image 80
Robert Höglund Avatar answered Nov 06 '22 11:11

Robert Höglund