2013-06-25 59 views
0
  1. 當我編譯這個時,我總是得到零而不是值的任何建議?值爲矩形類爲零

  2. 這裏的代碼是關於我創建的一個簡單的矩形類。

    #import <Foundation/Foundation.h> 
    
    @interface Rectangle : NSObject { 
         int width; 
         int height; 
    } 
    @property int width, height; 
    -(int) area; 
    -(int) perimeter; 
    -(void) setWH: (int) h: (int) w; 
    
    @end 
    
    
    #import "Rectangle.h" 
    
    @implementation Rectangle 
    @synthesize width, height; 
    -(int) area { 
         width*height; 
    } 
    -(int) perimeter { 
         (width+height)*2; 
    } 
    -(void) setWH:(int)h :(int)w { 
         w = width; 
         h = height; 
    } 
    @end 
    
    
    
    #import <Foundation/Foundation.h> 
    #import "Rectangle.h" 
    
    int main (int argc, const char*argv[]) { 
         @autoreleasepool { 
           Rectangle* r = [[Rectangle alloc]init]; 
    
           [r setWH: 6:8]; 
           NSLog(@"the width of the rectangle is %i and the hieght %i", r.width, r.height); 
           NSLog(@"the area is %i and the perimeter is %i", [r perimeter], [r area]); 
    
        } 
    } 
    

回答

3

你翻轉的變量賦值:

-(void) setWH:(int)h :(int)w { 
     w = width; 
     h = height; 
} 

應該

-(void) setWH:(int)h :(int)w { 
     width = w; 
     height = h; 
} 
+1

它確實應該是'setWH:(int)w:(int)h',以便名稱順序對應於參數順序。 –

+3

或更好' - (void)setWidth:(int)w和Height:(int)h'比setWH更清晰。 – PerfectPixel

+0

哦好的哇我沒有看到,謝謝 – user2304873

2

一開始我不知道如何它甚至編譯,因爲你可以」 t不需要self。然後我看到了實例變量。

@interface Rectangle : NSObject { 
     int width; 
     int height; 
} 
@property int width, height; 

不這樣做。 在現代Objective-C中,您不必爲屬性編寫實例變量,它們將自動合成(您不需要使用@synthesize)。當然,你可以自由地編寫它們(特別是如果你開始學習OBjective-C),但是你最好爲實例變量選擇其他名稱,否則會導致混淆。 一個標準的做法是用一個下劃線前面加一個屬性名稱。

//interface 
@property (nonatomic, assign) int myProperty; 

//implementation 
@synthesize myProperty = _myProperty; //this will synthesize a getter, a setter and an instance variable "_myProperty" 

你應該一般喜歡訪問屬性而不是實例變量,因爲這樣一來,你就可以改變屬性的實現(getter/setter方法/存儲數據的方法),而無需改變一切。 因此對於areaperimeter更好的解決方案是這樣的(@ PerfectPixel已經告訴過你return,所以只需注意self)。

-(int) area { 
    return self.width * self.height; 
} 
-(int) perimeter { 
    return (self.width + self.height) * 2; 
} 
+0

我不明白所以基本上我實際上不必輸入int寬度或高度,並且@property int寬度和高度是足夠的?自我和回報究竟意味着什麼? – user2304873

+0

是的,'@ property'聲明就足夠了。它會自動創建一個getter,setter並創建一個實例變量(在花括號中聲明的變量)。一個實例變量將有一個名爲「_yourPropertyNameHere」的屬性和屬性相同的類型。 如果您希望該屬性使用另一個實例變量,那麼可以使用 '@synthesize propertyName = yourVariableNameHere'來執行此操作。 'self'引用一個對象實例(像C#中的'this',Java或C++)。 'return someValue;'意味着當前函數作爲計算結果返回'someValue'。 – FreeNickname

+0

但所有這些問題都非常基本。我建議你閱讀一些關於Objective-C的文獻。 – FreeNickname