2010-11-21 6 views
5

tengo tres preguntas en torno a lo que creo que es el tema de estructuras en obj-cconfiguración y el uso de obj-c CGPoint, CGRect, y otros

1) ¿Por qué es que a menudo (o siempre) no puedo tomar ¿un miembro var que es un CGPoint o un CGRect y establece los valores uno por uno? Me parece que tengo que hacer:

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

en lugar de simplemente obj.myPoint.x = someValue etc.

2) ¿Es este comportamiento que es consistente a través de todas las estructuras en obj-c?

3) ¿Hay una manera fácil de agregar dos CGPoints? Parece que ya debería haberlo, pero no pude encontrar uno. Pensé que sería engorroso si tuviera que usar un CGPoint temporal para acumular valores entre dos CGPoints antes de configurar el var var de destino en la var temporal (porque no puedo hacer simplemente pointA.x + = pointB.x (mismo para y).

Respuesta

0

Esto es perfectamente normal. el 'obj' posee que var y tiene captadores y definidores, no se puede modificar partes de esa variable.

lo mejor que puede hacer es copiar la estructura y modificar lo que sea necesario.

también tenga en cuenta que puede utilizar la función CGPointMake (x, y) (y lo mismo para todas las estructuras CG), que es mucho más fácil.

Para actualizar esto es más fácil:

CGPoint point = obj.myPoint; 
point.x += 10.0f; 
obj.myPoint = point; 

Obj-C 2.0 esconde los captadores y definidores, que se ve así:

CGPoint point = [obj myPoint]; 
point.x += 10.0f; 
[obj setMyPoint:point]; 
11

1) desde @sb en una respuesta a Cocoa Objective-c Property C structure assign fails

Eso no logrará nada, porque [t miembro] devuelve una estructura, que es un "valor r", es decir. un valor que solo es válido para usar en el lado derecho de una tarea. Tiene un valor, pero no tiene sentido intentar cambiar ese valor.

Básicamente, solo tiene que vivir con el hecho de que no puede establecer los campos de struct directamente cuando se devuelve desde una función.

2) Sí

3) Por desgracia, no creo que haya incorporado un método de conveniencia para añadir dos CGPoint. Si encuentra que su auto haciendo esto con frecuencia puede hacer su propia:

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

y luego usarlo como:

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

no tan elegante como obj.pointA.X += ... pero a veces la vida no es justa.

Cuestiones relacionadas