Usando la notación de punto, por ejemplo, methods

Estaba mirando un trozo de código hoy y me doy count de que este codificador particular usa la notación de puntos para acceder a los methods de instancia (estos methods no toman valores, solo devuelven valor).

Por ejemplo:

@interface MyClass : NSObject { } -(double)add; @end @implementation MyClass -(double)valueA { return 3.0; } -(double)valueB { return 7.0; } -(double)add { return self.valueA + self.valueB; } @end 

Lo hizo a través de su código y el comstackdor no se queja, pero cuando lo bash en mi código como en el ejemplo anterior, obtengo el siguiente error: "Solicitud de miembro" valorA "en algo que no sea una estructura o unión". ¿Qué me falta, alguna idea?

La syntax de punto generalmente se aplica a las properties declaradas, pero eso no es obligatorio. Usar obj.valueA y obj.valueB funciona.

El post de error que está recibiendo probablemente se deba a que el object no tiene un tipo explícito MyClass * . Por ejemplo, los siguientes trabajos:

 MyClass *obj1 = [MyClass new]; NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]); 

Por otra parte:

 MyClass *obj1 = [MyClass new]; NSLog(@"%f %f %f", obj1.valueA, obj1.valueB, [obj1 add]); id obj2 = obj1; NSLog(@"%f %f %f", obj2.valueA, obj2.valueB, [obj2 add]); 

da:

 error: request for member 'valueA' in something not a structure or union error: request for member 'valueB' in something not a structure or union 

porque obj2 tiene id tipo, por lo que el comstackdor no tiene suficiente información para saber que .valueA y .valueB son en realidad los methods getter -valueA y -valueB . Esto puede suceder si coloca objects de tipo MyClass en un NSArray y más tarde los recupera a través de -objectAtIndex: ya que este método devuelve un object genérico de tipo id .

Para apaciguar al comstackdor, debe convertir el object en MyClass * y solo entonces usar la syntax de puntos. Puede lograr esto por:

 MyClass *obj2 = obj1; // or MyClass *obj2 = [someArray objectAtIndex:someIndex]; // and then obj2.valueA 

o, si obj2 se declara como id :

 ((MyClass *)obj2).valueA 

o, si el object es devuelto por un método cuyo tipo de retorno es id :

 ((MyClass *)[someArray objectAtIndex:someIndex]).valueA 

Alternativamente, puede simplemente deshacerse de la syntax de punto en set (mi favorito):

 [obj2 valueA] [[someArray objectAtIndex:someIndex] valueA]