当我编译这个时,我不断得到零而不是任何建议的值?
这里的代码是关于我创建的一个简单的矩形类。
#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]);
}
}
答案 0 :(得分:3)
你翻转了变量赋值:
-(void) setWH:(int)h :(int)w {
w = width;
h = height;
}
应该是
-(void) setWH:(int)h :(int)w {
width = w;
height = h;
}
答案 1 :(得分:2)
一开始我甚至不理解它是如何编译的,因为你不能在没有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"
并且您通常应该更喜欢访问属性而不是实例变量,因为这样您就可以在不更改其他所有内容的情况下更改属性(getters / setters /存储数据的方法)实现。
因此,对于area
和perimeter
,更好的解决方案就是这样(@PerfectPixel已经告诉过您return
,所以请注意self
)。
-(int) area {
return self.width * self.height;
}
-(int) perimeter {
return (self.width + self.height) * 2;
}