web-dev-qa-db-ja.com

Objective-Cゲッター/セッター

私はObjective-Cチュートリアルを進めようとしています。この本には次の例があります。

@interface
{
 int width;
 int height;
 XYPoint *Origin;
}
@property int width, height;

「XYPointオブジェクトのゲッター/セッターはありません。コードは機能しますが」と思いました。今、私は多分私自身の質問に答えるつもりです:)。

「原点」はすでにポインタであり、「幅」と「高さ」の内部で起こっていることは、それらへのポインタが作成されることになるからだと思います。

私は正しいですか、それとも私はBSを話しているのですか:) ??

私はそれを取得しません。ここにメインがあります:

#import "Rectangle.h"
#import "XYPoint.h"
int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Rectangle *myRect = [[Rectangle alloc] init];
    XYPoint *myPoint = [[XYPoint alloc] init];

    [myPoint setX: 100 andY: 200];
    [myRect setWidth: 5 andHeight: 8];

    myRect.Origin = myPoint; 

    NSLog (@"Rectangle w = %i, h = %i",
           myRect.width, myRect.height); 

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

    NSLog (@"Area = %i, Perimeter = %i",
           [myRect area], [myRect perimeter]);

    [myRect release];
    [myPoint release];
    [pool drain];

    return 0;
}

そして、これがRectangleオブジェクトです。

#import "Rectangle.h"
#import "XYPoint.h"

@implementation Rectangle
@synthesize width, height;

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

- (void) setOrigin: (XYPoint *) pt
{
    Origin = pt;
}
-(int) area
{
    return width * height;
}
-(int) perimeter
{
    return (width + height) * 2;
}
-(XYPoint *) Origin
{
    return Origin;
}
@end

私が理解していないのは、メインのこの行です:myRect.Origin = myPoint;私はそれのためのセッターを作りませんでした。

ところで、あなたの速い返事をありがとう

10
pic-o-matic

私が理解していないのは、メインのこの行です:myRect.Origin = myPoint;私はそれのセッターを作成しませんでした。

isOriginクラスのRectangle用に作成されたゲッターとセッター(まとめてアクセサーと呼ばれる)の両方があります。 Rectangleの実装を見てみると、これはゲッターです。

-(XYPoint *) Origin
{
    return Origin;
}

そしてこれはセッターです:

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

そしてObjective-C2.0の呼び出しの時点で:

myRect.Origin = myPoint;

と同等です:

[myRect setOrigin:myPoint];

@propertyを使用してゲッターとセッターを宣言する(そして@synthesizeを使用してそれらを実装する)ことは、アクセサーを宣言および作成する1つの方法にすぎず、クラスインターフェイスで宣言するプロパティがたくさんある場合に便利です。 。 Schildmeijerが言ったように、@property int widthは2つのメソッドを宣言することと同等です。

- (int)width;
- (void)setWidth:(int)newWidth;

Objective-Cメソッド呼び出しの動的にバインドされた性質により、インターフェイスでgetterメソッドとsetterメソッドを宣言することすらhaveしませんが、一般的にはそうすることがベストプラクティスです。それらを他のクラスに公開されているものとして宣伝します。

23
Alex Rozanski

プロパティ宣言は、2つのアクセサメソッドを宣言することと同等であると考えることができます。したがって、

@property int width;

と同等です:

- (int)width;

- (void)setWidth:(int)newWidth;
6
Schildmeijer
//Rectangle.h
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property int Width;
@property int Height;
-(int)Area;
@end

//Rectangle.m
#import "Rectangle.h"
@implementation Rectangle
@synthesize Width;/*Will create value Width , Setter called"setWidth" and Getter called "Width"*/
@synthesize Height;/*Will create value Height , Setter called"setHeight" and Getter called "Height"*/

-(int)Area
{
    return Width*Height;
}
@end


//  main.m
#import <Cocoa/Cocoa.h>
#import "Rectangle.h"
int main(int argc, const char * argv[])
{
    Rectangle *myRectangle = [Rectangle new];

    myRectangle.Width=3;
    myRectangle.Height=5;
    printf("Area = %d\n",[myRectangle Area]);

    //Or
    [myRectangle setWidth:5];
    [myRectangle setHeight:6];
    printf("Area = %d\n",[myRectangle Area]);

}

Getterのみを作成する場合、またはgetterとsetterの名前を変更する場合

•読み取り専用

•getter = newGetterName

•setter = new SetterName

//Rectangle.h
#import <Foundation/Foundation.h>
@interface Rectangle : NSObject
@property (getter = getWidth) int Width;
@property (readonly) int Height;
@end
1
Mohamed Ali

どのコードが機能しているのか、または「機能している」ことに対する期待は何であるかはわかりません。

上記のインターフェースは、他のオブジェクトから[object setWidth:1];またはobject.width = 1;として呼び出すことができる幅と高さの単純なアクセサーメソッドを作成します。これら2つは類似しています。

Originは他のオブジェクトタイプであり、ポインタです。ただし、アクセサメソッドを生成するためにプロパティを宣言する必要があります。

0
Paul Lynch

ゲッターとセッターは、別のクラスからインスタンス変数にアクセスする必要がある場合、またはバインディングを使用してそれらを取得/設定している場合に最も役立ちます。したがって、幅と高さにはこの機能が必要ですが、原点には必要ないと思います。あなたが述べたように、ゲッター/セッターは整数からポインターを作成しないことに注意してください。 intはintであり、ゲッター/セッターはそれを変更しません。

0
regulus6633