2013-02-06 33 views
0

大家好,這是我的第一篇文章。Objective C方法參數標籤的錯誤

我不知道爲什麼我在代碼中收到錯誤消息。它應該輸出矩形的面積和周長。我不想完全改變代碼,而是想要縮小所涉及的代碼行。這是代碼。我指出了有關問題。

recty.h:

#import <Foundation/Foundation.h> 

@interface recty: NSObject { 
    int width; 
    int height; 
} 

@property int width, height; 
- (int)area; 
- (int)perimeter; 
- (void)setWH:(int) w:(int)h; // 'w' used as name of previous parameter rather than as part of selector 
@end 

recty.m:

#import "recty.h" 

@implementation recty 
@synthesize width, height; 

- (void)setWH:(int) w:(int) h { 
    //'w' used as name of previous parameter rather than as part of selector 
} 

- (int)area { 
    return width * height; 
} 
- (int) perimeter { 
    return (width + height) * 2; 
} 
@end 

的main.m:

#import <Foundation/Foundation.h> 
#import "recty.h" 
int main(int argc, const char * argv[]) { 
    recty *r = [[recty alloc]init]; 
    [r setWH:6 :8]; 
    @autoreleasepool { 
     // insert code here... 
     NSLog(@"recty is %i by %i", r.width, r.height); 
     NSLog(@"Area = %i, Perimeter = %i", [r area], [r perimeter]); 
    } 
    return 0; 
} 

它有沒有用H做我正在聲明參數?我在代碼中列出了錯誤信息。我使用Xcode和使代碼2歲的信息。也許一些代碼已經過時了?

+2

您是否在發佈問題之前搜索了stackoverflow上的錯誤消息? –

回答

2

編譯器指出方法名稱是以不明確的方式編寫的。

- (void)setWH:(int) w:(int)h; // 'w' used as name of previous parameter rather than as part of selector 

這將是容易認爲該方法是setWH:w:而不是什麼它確實是這是setWH::。那w是不明確的。

它應該是:

- (void) setW:(int)w h:(int)h; 

或者,更好的,沒有必要縮寫:

- (void) setWidth:(int)width height:(int)height; 

更好,不過,雖然是去充分的蒙蒂,只是使用性質:

@property int width; 
@property int height; 

即使如此,也許會有問題。由於你的班級代表了一個矩形(應該叫Recty,而不是recty - 班級以大寫字母開頭),那麼你可能會想要使用CGFloat作爲寬度和高度。除非你正在模擬一個棋盤遊戲,其中的寬度/高度是真正的積分。然後這樣做:

@property int boardWidth; 
@property int boardHeight; 

其實,有你的代碼中的一些其他問題(主要是,它不是現代的,不是徹底打破)。我建議:

@interface Recty:NSObject 
- (instancetype) initWithWidth:(CGFloat)width height:(CGFloat)height; 

@property CGFloat width; 
@property CGFloat height; 

- (CGFloat) area; 
- (CGFloat) perimeter; 
@end 

@implementation Recty 
- (instancetype) initWithWidth:(CGFloat)width height:(CGFloat)height; 
{ 
    self = [super init]; 
    if (self) { 
     _width = width; 
     _height = height; 
    } 
    return self; 
} 

- (CGFloat)area { 
return self.width * self.height; 
} 
- (CGFloat) perimeter { 
return (self.width + self.height) * 2; 
} 
@end 


int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     Recty *r = [[Recty alloc] initWithWidth:6 height:8]; 
     NSLog(@"recty is %f by %f", r.width, r.height); 
     NSLog(@"Area = %f, Perimeter = %f", [r area], [r perimeter]); 
    } 
    return 0; 
} 

的Objective-C沒有命名的參數。它將方法名稱與參數交錯。雖然方法名稱的任何部分可能只是一個光禿禿的:,但這是非常積極的阻止。編譯器警告更是如此。

+0

令人難以置信的洞察力,謝謝。請保持聯繫生病在這個項目整天和一週的工作.. – Adreamer82

+0

我不斷收到錯誤的主要它說使用未聲明的標識符'R'即時通訊使用上面的代碼給你。 – Adreamer82

+1

我在寫完代碼後,從Xcode複製/粘貼了該代碼。如果您收到錯誤,您的代碼必須不同。編輯問題以顯示新的main()。 – bbum