gpt4 book ai didi

objective-c - Objective-C - 访问器,即 Getters/Setters

转载 作者:太空狗 更新时间:2023-10-30 03:41:21 24 4
gpt4 key购买 nike

我已经广泛阅读了已经发布的问题,但无法完全找到我正在寻找的答案。

我完全理解使用 @syntesize 指令创建 getter 和 setter 方法的概念(即如果我有 @property int width@synthesize width ,我无意中创建了 width 的 getter 方法和 setWidth: 的 setter 方法。

但是,当我没有使用 @synthesize 指令而是在 @implementation 部分声明实例变量是对象时,我不完全理解访问器是如何工作的方法有效。这是我对以下代码不理解的地方:

1) 在 main 中写着:

NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);

在我看来,它似乎会调用 [[myRect origin1] x] 方法,该方法首先确定 [myRect origin1] 返回 origin 然后会立即调用 [origin x] 作为结果(然后对 y 执行相同的操作)。现在,让我失望的是,如果我要更改 getter 方法的名称

-(XYpoint *) origin1;

包含在 Rectangle.h 中

-(XYpoint *) origin2;

程序出现大量错误并停止编译。注意:我还在引用该方法的所有地方更改了名称,包括将 main 中的前面代码更改为

NSLog(@"Origin at (%i, %i)", myRect.origin2.x, myRect.origin2.y);

但是,如果我也更改 setter 方法的名称:

-(void) setOrigin1: (XYpoint *) pt

到:

-(void) setOrigin2: (XYpoint *) pt

然后一切都像以前一样工作。在我看来,只有当我的 getter 和 setter 都在 x setX 命名约定中命名时,它才能正常工作。我想这主要是我需要解释的:

A) 如果我创建的实例变量恰好是一个对象(如本例中的“origin”),我必须为其创建 getter 和 setter 方法吗?

B) 我可以创建一个 getter 方法而不是 setter 方法吗,反之亦然

C) 如果我确实为“origin”创建了 getter 和 setter 方法,那么它们是否必须以 x setX 方式命名。在本例中为 -(XYpoint *) origin1-(void) setOrigin1: (XYpoint *) pt。就像我更改 getter 的名称一样,我必须相应地更改 setter 的名称吗?

这里是所有的代码:

矩形.h:

#import <Foundation/Foundation.h>
@class XYpoint;

@interface Rectangle : NSObject

@property int width, height;

-(XYpoint *) origin1;
-(void) setOrigin1: (XYpoint *) pt;
-(void) setWidth: (int) w andHeight: (int) h;
-(int) area;
-(int) perimeter;

@end

矩形.m:

#import "Rectangle.h"

@implementation Rectangle
{
XYpoint *origin;
}

@synthesize width, height;

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


-(void) setOrigin1: (XYpoint *) pt
{
origin = pt;
}

-(int) area
{
return width * height;
}

-(int) perimeter
{
return (width + height) * 2;
}

-(XYpoint *) origin1
{
return origin;
}

@end

XY点.h:

#import <Foundation/Foundation.h>

@interface XYpoint : NSObject

@property int x, y;

-(void) setX: (int) xVal andY: (int) yVal;
@end

XY点.m:

#import "XYpoint.h"

@implementation XYpoint

@synthesize x,y;

-(void) setX: (int) xVal andY: (int) yVal
{
x = xVal;
y = yVal;
}
@end

主要.m:

#import <Foundation/Foundation.h>
#import "Rectangle.h"
#import "XYpoint.h"

int main (int argc, const char * argv[])
{

@autoreleasepool {
Rectangle *myRect = [[Rectangle alloc] init];
XYpoint *myPoint = [[XYpoint alloc] init];

[myPoint setX: 100 andY: 200];
[myRect setWidth: 5 andHeight:8];
myRect.origin1 = myPoint;
NSLog(@"Rectangle w = %i, h = %i", myRect.width, myRect.height);
NSLog(@"Origin at (%i, %i)", myRect.origin1.x, myRect.origin1.y);
NSLog(@"Area = %i, Perimeter = %i", [myRect area], [myRect perimeter]);
}
return 0;
}

最佳答案

A) If I create an instance variable that happens to be an object (like 'origin' in this case) must I create getter and setter methods for it?

没有。如果您声明一个属性,则需要提供您自己的访问器或使用 @synthesize 指令来创建它们。但是您可以拥有所有您喜欢的实例变量,而无需访问它们。

B) Can I create a getter method but not a setter method or vice versa

是的,如果您将属性声明为readonly,则可以只提供 getter。

C) Is it mandatory that if I do create both a getter and setter method for 'origin' that they both be named in the x setX manner. In this case as -(XYpoint *) origin1 and -(void) setOrigin1: (XYpoint *) pt. As in if I change the name of the getter I must change the name of the setter accordingly?

您可以为访问器提供您自己的名称,但如果您希望您的类符合所讨论属性的键值编码,则应遵循通常的约定:

@property (getter=isBar, setter=setBar) int bar;

关于objective-c - Objective-C - 访问器,即 Getters/Setters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com