2009-06-05 6 views
0

J'essaie de créer une méthode qui prend plusieurs paramètres en utilisant & (pour l'adresse-de). Ce que j'aimerais faire, c'est que la méthode fasse des calculs et ajuste les paramètres pour qu'ils puissent être utilisés ailleurs.Adresse de syntaxe de la méthode Objective-C de

J'ai défini la méthode comme:

- (void) convertParameters: (double *)x: (double *)y: (double *)z: (double *)height: (double *)width: (double *)phi: (double *)theta: (double *)psi: (int) topLeft: (int) topRight: (int) bottomLeft: (int) bottomRight 
{ 
    ... 
} 

Ce que je ne peux pas comprendre comment appeler la méthode. J'ai essayé ceci:

double x, y, z, height, width, phi, theta, psi; 

[self convertParameters: &x &y &z &height &width &phi &theta &psi topLeft topRight bottomLeft bottomRight]; 

mais je reçois ces erreurs de Xcode:

erreur: opérandes invalides à binaire &

erreur: erreur de syntaxe avant 'topRight'

erreur : opérandes non valides en binaire &

erreur: erreur de syntaxe avant 'topRight'

Auparavant, j'ai défini topRight, etc. comme: const int topLeft = 25; const int topRight = 29; const int bottomLeft = 17; const int bottomRight = 13; et ils peuvent être utilisés ailleurs dans le code. Je suis perplexe quant à la façon de résoudre ce problème.

Répondre

6

La définition de votre méthode est erronée. Vous avez des déclarations de type mais pas de paramètres réels. Vous semblez confondre les noms des paramètres dans le nom de la méthode avec les arguments réels, mais ce sont des choses séparées. Il devrait être quelque chose comme:

- (void) convertX:(double *)x y:(double *)y z:(double *)z height:(double *)height width:(double *)width phi:(double *)phi theta:(double *)theta psi:(double *)psi topleft:(int)topLeft topRight:(int)topRight bottomLeft:(int)bottomLeft bottomRight:(int)bottomRight 
{ 
    ... 
} 

Voyez comment vous avez la partie du nom de la méthode « y: » suivi de l'argument (double *)y? C'est comme ça que ça fonctionne. Vous ne pouvez pas mettre des types sur des parties du nom de la méthode.

Vous devez également inclure le nom lorsque vous appelez la méthode. Il ne suffit pas de nommer les variables après les parties du nom de la méthode. Donc vous l'appelez comme:

[self convertX:&x y:&y z:&z height:&height width:&width phi:&phi theta:&theta psi:&psi topLeft:topLeft topRight:topRight bottomLeft:bottomLeft bottomRight:bottomRight] 
+0

ahh vous me battre à elle! Upvoted. La syntaxe d'Objective-C est un peu différente de Java, C# et Co., donc ça vaut la peine d'acheter un livre si c'est quelque chose que vous allez beaucoup travailler :-) –

5

En Objective-C, le nom de la méthode inclut tous les deux-points pour les arguments. Puisque vous ne l'avez pas nommé vos arguments, la signature de votre méthode ci-dessus serait:

convertParameters::::::::::::; 

Cependant, cela est assez difficile à utiliser (et difficile à retenir), donc une voie commune pour mettre en œuvre vos méthodes est de fournir noms pour les arguments qui expliquent ce qu'ils font.

Arguments prennent la forme:

[argumentName]: ([argument type])[argumentIdentifier] 

avec chaque argument séparés par un espace, et où argumentName suivie du côlon sont utilisés pour transmettre un argument de la méthode.

Une meilleure façon de nommer votre méthode serait:

- (void)convertParametersWithX: (double*)x 
         withY: (double*)y 
         withZ: (double*)z 
         height: (double*)height 
         width: (double*)width 
          phi: (double*)phi 
         theta: (double*)theta 
          psi: (double*)psi 
         topLeft: (int)topLeft 
         topRight: (int)topRight 
        bottomLeft: (int)bottomLeft 
        bottomRight: (int)bottomRight; 

Ce serait alors appelé comme suit:

[receiver convertParametersWithX: &x 
          withY: &y 
          withZ: &z 
          height: &height 
          width: &width 
          phi: &phi 
          theta: &theta 
          psi: &psi 
         topLeft: topLeft 
         topRight: topRight 
         bottomLeft: bottomLeft 
        bottomRight: bottomRight]; 

Cela est plus facile à utiliser, car les noms d'argument vous dire ce que le l'argument est supposé être, donc cela réduit les erreurs de passer des arguments dans le mauvais ordre (ce qui serait une méthode complètement différente).

Questions connexes