我几周来一直在与一个在线Objective-c课程一起奋斗。我感觉非常愚蠢.. 我最近的任务是编写一个程序,通过询问用户圆的半径,创建一个圆形对象,然后报告圆的面积,直径和周长来演示一个名为Circle的类。 我们应该有以下成员变量:
radius: a double
pi: a double initialized to 3.14159
以及以下成员函数:
setRadius - a mutator function for the radius variable
getRadius - an accessor function for the radius variable
getArea - returns the area of the circle, which is calculated as: area = pi * radius * radius
getDiameter - returns the diameter of the circle, which is calculated as: diameter = radius * 2
getCircumference - returns the circumference of the circle, which is calculated as: circumference = 2 * pi * radius
该类的成员变量应设置为private。
到目前为止,这是我的计划:
主:
int main(int argc, const char * argv[])
{
@autoreleasepool {
int radius;
NSLog(@"Enter the circles radius:");
scanf ("%d", &radius);
}
return 0;
}
接口:
#import <Foundation/Foundation.h>
//circle class
@interface circle : NSObject
{ @private
-(double) radius;
-(double) pi;
}
@property int setRadius, getRadius;
-(double) getArea;
-(double) getDiameter;
-(double) getCircumcerence;
@end
实施:
#import "circle.h"
@implementation circle
@synthesize setRadius, getRadius;
-(double) pi
{
pi = 3.14159;
}
-(double) getArea
{
pi * radius * radius;
}
-(double) getDiameter
{
radius * 2;
}
-(double) getCircumcerence
{
2 * pi * radius;
}
@end
正如你所看到的,我没有走得太远。我很困惑如何在我的主要方面简单地使用我的方法,并且我确定我已经犯了错误。
任何建议表示赞赏!我真的需要帮助,而且时间紧迫。 此外,这可能是牵强附会,但如果有人可以跟我一起skype并帮助我完成它? 谢谢!
答案 0 :(得分:2)
首先,您应该将.h
设置为更像这样的内容:
@interface Circle : NSObject
@property double radius;
@property (readonly) double area;
@property (readonly) double diameter;
@property (readonly) double circumference;
@property (readonly) double pi;
-(id)initWithRadius:(double)r;
+(instancetype)circleWithRadius:(double)r;
@end
这将为setter
设置getter
和radius
,为getters
,area
和{{1}设置diameter
}}。它还为circumference
设置了init
和factory
方法,该方法的半径为双倍。
我将返回并修改您需要对circle
以及.m
文件进行的一些修改,以便完成这项工作。请注意,我们至少会覆盖3 main
个属性的getters
。这将阻止编译器为这些属性创建readonly
(实例变量)(因为我们可以在计算它时计算并返回我们计算的数字)。
在ivars
:
.m
在#import Circle.h
@implementation Circle
-(id)initWithRadius:(double)r
{
self = [super init];
if(self) {
self.radius = r;
}
return self;
}
+(instancetype)circleWithRadius:(double)r
{
return [[Circle alloc] initWithRadius:r];
}
-(void)setRadius:(double)r //This method is automatically created by @property
{ //include any verification logic (make sure r>0 etc), then...
self.radius = r;
}
//we don't really need to override the radius getter
-(double)pi
{
return 3.14159; //or however much accuracy you want
}
-(double)area
{
return (self.pi * self.radius * self.radius);
}
-(double)diameter
{
return (2.0 * self.radius);
}
-(double)circumference
{
return (self.diameter * self.pi);
}
中,您可以像使用Objective-C中的任何其他对象一样使用此main
类(考虑Circle
,NSString
等)
NSArray
答案 1 :(得分:0)
当然有很多方法可以解决这个问题。我记得在开始时感到困惑,下面是另一个给你一些其他东西看的例子。
它不是花哨的,而只是简单的,所以你可以看到使用初始化程序的类的最小设置。
请注意,初始化的唯一值是const pi,当然,也可以在那里初始化半径,因为nhgrif的示例非常好。
希望这有帮助!
// Circle.h
#import <Foundation/Foundation.h>
@interface Circle : NSObject
{
double radius;
double pi;
}
@property double radius, pi;
-(double) getArea;
-(double) getDiameter;
-(double) getCircumference;
@end
然后执行:
// Circle.m
#import "Circle.h"
@implementation Circle
@synthesize radius, pi;
// Initialize with const pi:
- (id)init {
self = [super init];
if (self) {
pi = 3.14159;
NSLog(@"Circle created.");
}
return self;
}
-(double) getArea {
return pi*radius*radius;
}
-(double) getDiameter {
return 2*radius;
}
-(double) getCircumference {
return 2*pi*radius;
}
@end
然后是主要的:
// main.m
#import <Foundation/Foundation.h>
#import "Circle.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Circle *aCircle = [[Circle alloc] init];
// Use an arbitrary value:
[aCircle setRadius:2];
NSLog(@"Area = %f",[aCircle getArea]);
NSLog(@"Circumference = %f",[aCircle getCircumference]);
NSLog(@"Diameter = %f",[aCircle getDiameter]);
NSLog(@"Check pi = %f",[aCircle pi]);
}
return 0;
}