我正在建立一个基本的几何类,在其中我定义了一个矩形,可以在计算面积和周长的同时操作宽度和高度。除了周长和面积变量返回为零之外,所有操作和输出都很好。我不知道如何在变量本身或@implementation
期间正确设置变量,所以我确信它显示的是从变量第一次初始化时(在设置宽度和高度之前)的零。
我对OOP和ObjC缺乏经验,所以我可能会错过一些简单的东西。
#import <Foundation/Foundation.h>
// @interface setup as required.
@interface Rectangle: NSObject
-(void) setWidth: (int) w;
-(void) setHeight: (int) h;
-(int) width;
-(int) height;
-(int) area;
-(int) perimeter;
-(void) print;
@end
// @implementation setup for the exercise.
@implementation Rectangle {
int width;
int height;
int perimeter;
int area;
}
// Set the width.
-(void) setWidth: (int) w {
width = w;
}
// Set the height.
-(void) setHeight: (int) h {
height = h;
}
// Calculate the perimeter.
-(int) perimeter {
return (width + height) * 2;
}
// Calculate the area.
-(int) area {
return (width * height);
}
-(void) print {
NSLog(@"The width is now: %i.", width);
NSLog(@"The height is now: %i.", height);
NSLog(@"The perimeter is now: %i.", perimeter);
NSLog(@"The area is now: %i.", area);
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
// Create an instance of Rectangle.
Rectangle *theRectangle;
theRectangle = [Rectangle alloc];
theRectangle = [theRectangle init];
// Use the designed methods.
[theRectangle setWidth: 100];
[theRectangle setHeight: 50];
[theRectangle print];
}
return 0;
}
简短回答:
这样调用对象方法:
[self perimeter];
// as in
NSLog(@"The perimeter is now: %i.", [self perimeter]);
而不仅仅是
perimeter
它访问具有该名称的变量,而不是调用您定义的方法。
更长的答案:
您的代码中有几点可以改进:
您应该使用属性而不是ivar和方法来获取和设置它们。像这样声明的属性:@property (nonatomic) int width;
将为您提供由编译器隐式创建的getter和setter。因此,您可以执行以下任一操作来设置值:
theRectangle.width = 100;
// is the same as:
[theRectangle setWidth:100];
你也可以覆盖你的getter和setter。您还可以创建只读属性,例如
@interface Rectangle: NSObject
@property (nonatomic) int width;
@property (nonatomic) int height;
@property (nonatomic, readonly) int perimeter;
@end
@implementation Rectangle
- (int)perimeter
{
return self.width * self.height * 2;
}
@end