gpt4 book ai didi

objective-c - 初学者对 objective-c 、赋值、属性等的困惑

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:20 27 4
gpt4 key购买 nike

抱歉,我不能在标题中描述更多。我知道 C++ 和 C#,还有一点 Java,我正在做一些 Objective C 教程,但无法解释这里发生了什么。

我给你举个例子:

这是矩形类的标题/接口(interface):

#import <Foundation/Foundation.h>

@class XYPoint;
@interface Rectangle : NSObject

@property int width, height;

-(int) area;
-(int) perimeter;
-(void) setW:(int)w andH:(int)h;
-(XYPoint *) origin;
-(void) setOrigin:(XYPoint*)pt;

@end

实现如下:

#import "Rectangle.h"

@implementation Rectangle{
XYPoint *origin;
}

@synthesize width, height;

-(void) setW:(int)w andH:(int)h
{
width = w;
height = h;
}

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

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

-(XYPoint *) origin{
return origin;
}
-(void) setOrigin:(XYPoint*)pt{
origin = pt;
}

@end

这是我的主程序:

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


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

Rectangle *r = [[Rectangle alloc]init];
XYPoint *p = [[XYPoint alloc]init];

[p setX:100 andY:300];
[r setW:6 andH:8];

r.origin = p;

NSLog(@"Width and height is %i %i", r.width, r.height);
NSLog(@"Origin is at %i,%i", r.origin.x, r.origin.y);
NSLog(@"Arear and perimeter are %i and %i", [r area], [r perimeter]);

}
return 0;
}

r.origin = p; 行让我很困惑。这里究竟指的是哪个起源?接口(interface)中定义的getter方法,还是实现中声明的实际成员变量?

请注意 origin 不是属性。

老实说,我预计会出现错误。主程序应该只看到 getter 方法,但似乎返回某些内容的 getter 方法可能位于赋值运算符的左侧。或者系统是否以某种方式将该语法映射到对 setOrigin 的调用?

我原以为设置原点的唯一可能方法是 [r setOrigin: p]

我可以看到像 r.width = 5 这样的东西是如何工作的,因为在 header 中声明的宽度是一个属性,但我看不到 r.origin = p 有效。

谁能解释一下这是怎么回事?

谢谢。

最佳答案

您的猜测是正确的 - 这种称为点符号的语法被编译器翻译成对 [r setOrigin:p] 的调用。一般的想法是,就像大多数其他语言一样,您有对象属性的 getter 和 setter;在 Objective-C 中,这些通常写成:

- (type)variableName;
- (void)setVariableName:(type)aVariable;

只要您自己的代码符合这些约定,您就可以使用点符号在您的类上获取和设置变量,并相信您的方法会被调用。

幕后显然还有很多事情要做,所以我希望现在这个简短的解释对您来说已经足够了。不过,如果您有兴趣,可以进一步研究:

  • 综合属性和实际发生的事情 - 编译器生成上面显示的形式的方法,以及用于实际数据存储的实例变量
  • 利用这些原则和约定的键值编码
  • 某些类型的特殊情况(例如,BOOL 变量的 getter 通常写为 -isVariableName 而不是 -variableName),以及如何使用 @property 属性管理它们

关于objective-c - 初学者对 objective-c 、赋值、属性等的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11695063/

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