3

申し訳ありませんが、タイトルでこれ以上説明できませんでした。私は 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

誰かがここで何が起こっているのか説明できますか?

ありがとう。

4

2 に答える 2

3

[r setOrigin:p]あなたの推測は正しいです。ドット表記と呼ばれるその構文は、コンパイラによってへの呼び出しに変換されます。一般的な考え方は、他のほとんどの言語と同様に、オブジェクト プロパティのゲッターとセッターがあるということです。Objective-C では、これらは通常次のように記述されます。

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

独自のコードがこれらの規則に準拠している限り、ドット表記を使用してクラスの変数を取得および設定し、メソッドが呼び出されることを信頼できます。

舞台裏では明らかにもっと多くのことが行われているので、今はこの簡単な説明で十分だと思います。ただし、興味がある場合は、さらに詳しく調べることができます。

  • プロパティの合成と実際の動作 - 上記の形式のメソッドは、実際のデータ ストレージ用のインスタンス変数と共に、コンパイラによって生成されます。
  • これらの原則と規則を利用するキー値コーディング
  • 一部の型の特殊なケース (たとえば、BOOL変数の getter は通常、-isVariableNameではなく と記述されます)、およびそれらを属性-variableNameで管理する方法@property
于 2012-07-27T20:18:50.057 に答える
1

はい、ドット表記によって呼び出されるプロパティアクセサーは、コンパイラによってメソッド呼び出しに自動的に変換されます。したがって

variable = object.property;

と同等です

variable = [object property];

object.property = variable;

と同等です

[object setProperty:variable];
于 2012-07-27T20:27:05.177 に答える