2009-05-22 9 views
1

J'ai regardé cela encore et encore et je ne peux pas voir le problème. C'est probablement évident et je suis probablement un idiot et je m'excuse d'avance pour cela.pourquoi ma méthode objective c me donne une "erreur: ne peut pas utiliser un objet comme paramètre à une méthode"

Dans mon interface je:

 
@interface PolygonShape : NSObject 
{ 
    int numberOfSides; 
    int minimumNumberOfSides; 
    int maximumNumberOfSides; 

} 

@property int numberOfSides, minimumNumberOfSides, maximumNumberOfSides; 

// class methods 
+ (float)getAngleInDegrees:(PolygonShape *) polyshape; 
+ (float)getAngleInRadians:(PolygonShape *) polyshape; 
+ (NSString)getName:(PolygonShape *) polyshape; 

//instance methods 
- (id)init; 
- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min 
     maximumNumberOfSides:(int)max; 
@end 

La partie dans la mise en œuvre que je reçois des erreurs est la méthode getName:

 
@implentation... 

+ (NSString)getName:(PolygonShape *) polyshape 
{ 
// here is where I get the "error: can not use an object as parameter to a method" 
    int sides = [polyshape numberOfSides]; 
    NSString * s = [NSString init]; 

    switch (sides) { 
     case 3: 
      s = "@Triangle"; 
// there's also an "assignment from incompatible pointer type" warning...but its secondary 
      break; 
     case 4: 
      return "@Square"; 
      break; 

     default: 
      break; 
    } 
} 

Ce qui me pousse Batty est que les méthodes de classe fonctionne très bien:

+ (float)getAngleInDegrees:(PolygonShape *) polyshape; 
+ (float)getAngleInRadians:(PolygonShape *) polyshape; 
+0

init est une méthode d'instance, pas une méthode de classe. Vous devez créer une instance en envoyant alloc à la classe, puis envoyer init à cette nouvelle instance. Ainsi: [[NSString alloc] init]. De plus, vous n'avez pas du tout besoin de la variable s, puisque vous ne l'utilisez pas. Vous pouvez ensuite remplacer l'affectation dans le cas 3 par une déclaration de retour (comme celle du cas 4). –

+0

Merci Peter - vous avez absolument raison. Il peut être judicieux d'utiliser simplement [NSString new] mais cela semble découragé par rapport à ce que j'ai lu. – user102288

Répondre

4

Votre méthode getName: devrait renvoyer (NSString *), pas (NSString). Je suppose que c'est l'erreur; si oui, alors oui, le message d'erreur aurait certainement pu être plus informatif. En fait, en Objective-C vous ne verrez jamais les objets se passer sans * derrière eux, pas comme valeurs de retour, ni comme paramètres, ni comme variables locales et non comme variables membres.

BTW, l'avertissement que vous mentionnez est parce que vous avez une faute de frappe, mélanger "@foo" avec @ "foo". Ce dernier est un littéral de chaîne Objectice-C, le premier est un littéral de chaîne C dont le premier caractère est @.

+0

Vous avez absolument raison sur les deux points. Merci de m'avoir aidé à sauver ma santé mentale. Vous avez raison - je passe le pointeur pas l'objet que je dois indiquer avec le *. Je ne comprends pas pourquoi cela fait aussi une différence si son (NSString *) foo ou (NSString) * foo (le second formulaire ne serait pas plus correct en montrant que foo est un pointeur.) – user102288

+0

Je ne suis pas sûr de la détails, mais la façon dont j'y pense est que tant que vous avez affaire à des classes ObjC, les parenthèses et l'astérisque sont juste une syntaxe spéciale destinée à ressembler à la syntaxe du pointeur de C. Ainsi, l'analyseur ObjC les gère avec des règles spéciales. peut-être pas techniquement correct, mais probablement une bonne façon d'y penser tout en apprenant – harms

+1

ube: Le * fait partie de la spécification de type, et la spécification de type entier doit être dans le() –

1

Je pense que l'erreur est légèrement trompeuse dans ce cas. En Objective-C, il n'est généralement pas possible de passer un objet par valeur (y compris les valeurs de retour). Dans ce cas, vous déclarez la valeur de retour NSString au lieu de NSString*. La déclaration doit être:

+ (NSString*)getName:(PolygonShape *) polyshape 

pas

+ (NSString)getName:(PolygonShape *) polyshape 
+0

Merci Barry - tu as raison. Je passe un pointeur vers un objet. – user102288

3

Outre les autres réponses, vous utilisez [NSString init] où vous devez utiliser [[NSString alloc] init]. Cependant, cela n'allouera qu'une chaîne vide, donc vous feriez probablement mieux d'initialiser s soit @"" ou nil.

+0

Bon point - merci Jim. – user102288

Questions connexes