2012-12-07 2 views
2

énoncé du problème de base:Comment faire pointer le travail avec les méthodes d'accès à Objective-C

J'ai une très bonne raison pour faire quelques fanciness pointeur dans une application où je dois passer une décimale par référence.

J'ai donc une classe qui stocke beaucoup un nombre décimal, alors disons une propriété est a en tant que tel:

@property (nonatomic) double myDecimalValue; 

Je veux transmettre par référence à une autre classe.

[someOtherObject sendMyDecimalByReference:&myDecimalValue]; 

Mais, un problème se dégage! La façon dont a fait à écrire (parce qu'il est une propriété) est

[someOtherObject sendMyDecimalByReference:&decimalOrigin.myDecimalValue]; 

Cela ne peut pas compiler en c objectif

Je contourner en écrivant ce qui suit

- (double *) myDecimalValueRef; 

[someOtherObject sendMyDecimalByReference:[decimalOrigin myDecimalValue]]; 

Sauf J'ai des dizaines de ces décimales et je ne veux pas écrire cette fonction d'emballage stupide pour chaque valeur.

Existe-t-il un raccourci pour faire cela en Objective-C en utilisant seulement les fonctions Getter? Supposons simplement que j'ai une bonne raison de ne pas utiliser NSNumber.

Merci!

+0

Votre '(double *)' solution est la meilleure, mais il semble que vous essayez de travailler autour d'un défaut de conception fondamentale. – trojanfoe

+0

Je travaille autour d'un défaut de conception fondamentale ... :) –

+0

Bien le repenser; ça va te faire te sentir mieux ;-) – trojanfoe

Répondre

2

Pouvez-vous utiliser et accéder directement à une variable d'instance à la place d'une propriété? Ensuite, il fonctionnerait de la même manière en tant que membre struct C ...

@interface SomeClass : NSObject 
{ 
    @public 
    double myDecimalValue; 
} 

// Keep the getter or not, assuming you synthesize it in a way that uses the 
// myDecimalValue ivar 
@property (nonatomic) double myDecimalValue; 

@end 

Ensuite, vous pouvez accéder à cette façon:

[someOtherObject sendMyDecimalByReference:&decimalOrigin->myDecimalValue]; 

Bien sûr, la robustesse est limitée, someOtherObject doit rester objet valide lorsque vous déréférencer la valeur, et si vous avez des sous-classes/superclasses, vous devrez tenir compte de cette conception ...

+1

N'avez-vous pas besoin de faire 'myDecimalValue'' @ public' pour y accéder comme ça? – trojanfoe

+0

Vous avez raison, j'ai édité la réponse, la valeur par défaut est @protected ... – Guillaume

0

Bien que loin d'être idéal, vous pouvez rendre les ivars publics. Je déteste même dire cela, mais c'est une solution possible.

Une autre option consiste à créer une paire de propriétés pour chaque décimal. Créer propriété régulière et également une propriété de référence:

@interface Foo : NSObject 
    double _myDecimal; 

@property (nonatomic, assign) double myDecimal; 
@property (nonatomic, assign) double *myDecimalRef; 
@end 

@implementation Foo 
@synthesize myDecimal = _myDecimal; 

- (double *)myDecimalRef { 
    return &_myDecimal; 
} 

- (void)setMyDecimalRef(double *)val { 
    _myDecimal = *val; 
} 

@end 

Vous pouvez maintenant des choses comme:

[someOtherObject sendMyDecimalByReference:decimalOrigin.myDecimalRef]; 

Ou quelque chose comme ceci:

*decimalOrigin.myDecimalRef = 3.14; 
+0

Correction: @property (nonatomic, ** assing **) double * myDecimalRef; –

Questions connexes