2009-05-22 6 views
1

これを何度も見てきましたが、私は問題を見ることができません。おそらく明らかで、おそらく私はばかだと思うので、事前にお詫びします。私が持っている私のインターフェイスでなぜ私の客観的なメソッドは私に「エラー:メソッドのパラメータとしてオブジェクトを使用できないのですか」と伝えます

:バティ私を駆動する事がクラスメソッドということです

 
@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; 
    } 
} 

:私はエラーを取得する実装で

 
@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 

一部をgetNameメソッドのためにされます

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

initはインスタンスメソッドであり、クラスメソッドではありません。あなたはクラスにallocを送信してインスタンスを作成し、その新しいインスタンスにinitを送信する必要があります。したがって:[[NSString alloc] init]。また、変数を使用していないので、s変数はまったく必要ありません。その後、ケース3の割り当てをケース4のケースのようなreturnステートメントに置き換えることができます。 –

+0

ありがとうピーター - あなたは絶対に正しいです。 [NSString new]を使うのは意味があるかもしれませんが、それは私が読んだことから落胆しているようです。 – user102288

答えて

4

getName:メソッドは、(NSString *)ではなく(NSString)を返す必要があります。私はこれがエラーであると仮定します。もしそうなら、はい、エラーメッセージは間違いなくもっと有益でした。

実際、Objective-Cでは、戻り値としてではなくパラメータとしてではなく、ローカル変数としてではなくメンバ変数としてではなく、その背後にオブジェクトが渡されることはありません。

ところで、あなたが言いたいのは、 "@foo"と@ "foo"を混同しているためです。後者はObjectice-C文字列リテラルで、前者はC文字列リテラルで、その最初の文字はちょうど@です。

+0

あなたは絶対に両方のカウントをしています。私の正気を助けてくれてありがとう。 あなたは正しいと思います - 私は*で示さなければならないオブジェクトではなく、ポインタを渡しています。私はなぜそれが(NSString *)fooまたは(NSString)* foo(2番目の形式がポインタであることをより正確に示すのではないでしょうか)ということも理解できません。 – user102288

+0

私はObjCのクラスを扱っている限り、括弧とアスタリスクはCのポインタ構文に似た特殊な構文なので、ObjCパーサーは特別な規則でそれらを処理します。 – harms

+1

ube:*は型指定の一部であり、全体の型指定は()内になければなりません –

1

この場合、エラーは多少誤解を招く可能性があります。 Objective-Cでは、オブジェクトを値(戻り値を含む)で渡すことは一般的に不可能です。この場合、戻り値はNSString*ではなくNSStringと宣言します。宣言は次のようになります。他の回答に加えて

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

ない

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

バリーありがとうございます - あなたは正しいです。私はオブジェクトにポインタを戻しています。 – user102288

3

、あなたは[[NSString alloc] init]を使用する必要があります[NSString init]を使用しています。しかし、空の文字列しか割り当てられないので、おそらくsを@""またはnilのいずれかに初期化するほうがよいでしょう。

+0

良い点 - ジムに感謝します。 – user102288

関連する問題