2010-03-11 11 views
10

Quiero cambiar el valor de la variable que es miembro de una estructura de otra clase. Pero el valor no se cambia.Cocoa Objective-c La asignación de la estructura de la propiedad C falla

Aquí está el código.

//Structure.. 

typedef struct { 
    int a; 
    double b; 
} SomeType; 


//Class which has the structure as member.. 
@interface Test2 : NSObject { 
    // Define some class which uses SomeType 
    SomeType member; 

} 

@property SomeType member; 

@end 


@implementation Test2 

@synthesize member; 

@end 


//Tester file, here value is changed.. 
@implementation TesstAppDelegate 

@synthesize window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    // Insert code here to initialize your application 

    Test2 *t = [[Test2 alloc]init]; 

    t.member.a = 10; 
//After this the value still shows 0 

} 

@end 

Probé con el siguiente enlace.

Structure as a class member in Objective C

Saludos, Dhana.

Respuesta

22

Para realizar un cambio en la variable de instancia 'miembro', debe configurarla en su totalidad. Usted debe hacer algo como:

SomeType mem = t.member; 
mem.a = 10; 
t.member = mem; 

El problema es que t.member está siendo utilizado como un "captador" (ya que no es seguida inmediatamente por un '='), por lo t.member.a = 10; es lo mismo que [t member].a = 10;

Eso no logrará nada, porque [t member] 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, t.member está devolviendo una copia de su estructura 'miembro'. Inmediatamente está modificando esa copia y, al final del método, esa copia se descarta.

+0

Oh, 't.member.a' está bien para _reading_ el valor de' member.a'. Es exactamente lo mismo que '[t member] .a'. –

+0

Sí, funciona bien ... Estaba tratando de hacer todo de una vez ... – Dhanaraj

+1

¿Sabes de qué se trata ese sonido, alteza? Esos son los chillones desarrolladores de C#. Si no me crees, solo espera. ¡Siempre se hacen más fuertes cuando están a punto de usar la notación de puntos en Objective-C! http://www.youtube.com/watch?v=Tfo3nEZHNLk – Steve

4

Haga un puntero a su estructura en su lugar, luego simplemente desreferencia cuando desee cambiar una parte de ella.

Ejemplo:

struct myStruct { 
    int a, 
     b; 
}; 

@interface myClass : NSObject { 
myStruct *testStruct; 
} 

@property myStruct *testStruct; 

A continuación, para cambiar una parte de myStruct acaba de hacer myClassObject.testStruct->a = 55;

1

Cambie la línea sintetizar a:

@synthesize member = _member;

A continuación, puede asignar valores en una línea del código:

_member.a = 10;

Cuestiones relacionadas