申し訳ありませんが、タイトルでこれ以上説明できませんでした。私は C++ と C# を知っており、Java も少し知っています。Objective C のチュートリアルをいくつか行っていますが、ここで何が起こっているのか説明できません。
例を示します。
長方形クラスのヘッダー/インターフェースは次のとおりです。
#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;
は私を混乱させます。ここで言及されているのは正確にはどの起源ですか?インターフェイスで定義されている getter メソッドか、実装で宣言されている実際のメンバー変数か?
origin はプロパティではないことに注意してください。
正直なところ、私はエラーを期待していました。メイン プログラムはゲッター メソッドのみを表示する必要がありますが、何かを返すゲッター メソッドが代入演算子の左側にあるとは思えません。それとも、システムが何らかの方法でその構文を setOrigin の呼び出しにマッピングしているのでしょうか?
原点を設定する唯一の可能な方法は次のようなものになると思っていました[r setOrigin: p]
r.width = 5
ヘッダーで幅がプロパティとして宣言されているように、どのように機能するかはわかりますが、どのように機能するかはわかりませんr.origin = p
。
誰かがここで何が起こっているのか説明できますか?
ありがとう。