问题: 我知道origin是Rectangle类的实例变量,它具有XYPoint类型。 origin实例变量有两个其他实例变量x和y。我不清楚,矩形类中的if语句有什么作用?
我认为if(!origin)意味着如果原点不等于零,则执行以下操作......原点是否等于零?如果是,它如何等于零,以及如何在if(!origin)语句中验证它。换句话说,if(!origin)语句有什么作用?
是否存在原点等于零的实例?如果发生这种情况,我的代码将如何响应?我知道如果没有if语句,myPoint对象将不会保留其初始值。
我还想知道为什么我们在矩形类中使用了class指令而不是导入。它有什么不同。我还注意到我们没有在矩形的实现中导入XYPoint标头。如果有人愿意提供帮助,我将非常感激。非常感谢提前。
注意:请查看下面的代码。
* XYPoint类
#import <Foundation / Foundation.h>
@interface XYPoint: NSObject
@property int x, y;
-(void) setX: (int) Xval andY: (int) yVal;
@end
#import "XYPoint.h"
@implementation XYPoint
@synthesize x, y;
-(void) setX: (int) Xval andY: (int) yVal
{ x = xVal;
y = yVal;
}
@end
* 矩形类
#import <Foundation/Foundation.h>
@class XYPoint;
@interface Rectangle: NSObject
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
@end
#import "Rectangle.h"
@implementation Rectangle
{
XYPoint *origin
}
-(void) SetOrigin: (XYPoint *) pt
{
if (! origin)
origin = [[XYPoint alloc]init];
origin.x = pt.x;
origin.y = pt.y;
}
-(XYPoint *) origin
{
return origin;
}
@end
Main
#import "Rectangle.h"
#import "XYPoint.h"
int main (int argc, char *argv[])
{
@autoreleasepool {
XYPoint *myPoint = [[XYPoint alloc]init];
[myPoint setX: 100 andY: 200];
myRect.origin = myPoint;
NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y);
[myPoint setX: 50 andY: 75];
NSLog (@"Origin at (%i, %i)" , myRect.origin.x, myRect.origin.y);
}
@end
Origin at (100, 200)
Origin at (100, 200)
答案 0 :(得分:1)
定义实例变量会创建一个可用于引用实例的指针。它不会为您创建实例。所以,最初没有起源。
if语句检查源是否存在,如果不存在,则创建一个新的,然后代码复制参数中传递的值。
除此之外:理想情况下,点类将是不可变的并实现复制,因此不必重复创建新实例并更新它们,您只需复制传递的参数即可。复制在不可变类中不会做任何事情(返回self),并且只支持将来添加可变类。
答案 1 :(得分:0)
声明时,对象实例变量设置为nil
,就C / Objective-C而言为零。
要使用对象,必须对其进行初始化。这就是if
语句检查和执行的操作
if (! origin) // alternative syntax if (origin == nil)
origin = [[XYPoint alloc] init];
装置
如果对象
nil
初始化它。如果没有跳过该行。
当代码中仅提及类的类型且不需要头文件时,使用class
指令而不是import
语句。
在代码中,如果类是用单独的文件编写的,则需要import语句。
PS:您的代码中存在一些小写/大写错别字,并且缺少分号。