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]