Почему я не могу назначить значение переменной напрямую? - PullRequest
1 голос
/ 19 августа 2010

Я - новая Задача C. Я пытаюсь понять и отработать проблемы из Программирования Стивена Кочана в Задаче c 2.0.Эта проблема из главы 8.

Что я не понимаю, так это: почему я не могу назначить значения переменных напрямую, когда я могу их получить.

Например:

Это не дает мне ошибку или предупреждение.Но он также не устанавливает значения X и Y.

go.origin.x = 300;
go.origin.y = 100;

Но это прекрасно работает и дает мне ожидаемый результат:

NSLog (@"print %i, %i", go.origin.x, go.origin.y);

Вот мой XYPoint.h

#import <Foundation/Foundation.h>

@interface XYPoint : NSObject {

    int _x;
    int _y;

}
@property int x;
@property int y;

@end

XYPoint.m

#import "XYPoint.h"

@implementation XYPoint

@synthesize x = _x;
@synthesize y = _y;
@end

GraphicObject.h

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

@interface GraphicObject : NSObject {

    XYPoint *_origin;
}

@property (nonatomic, retain) XYPoint *origin;

-(void) setOrigin : (XYPoint *) pt;

@end

GraphicObject.m

#import "GraphicObject.h"

@implementation GraphicObject

@synthesize origin = _origin;

-(void) setOrigin : (XYPoint *) pt {

    _origin = [[XYPoint alloc] init];

    _origin = pt;

    //_origin.x = pt.x;
    //_origin.y = pt.y;

}

@end

Также, если не хотитемои origin.x и origin.y должны быть изменены при изменении xypoint x и y, почему я должен это сделать:

_origin.x = pt.x;
_origin.y = pt.y;

и почему бы просто:

_origin = pt;

Например, в main файле:

XYPoint *myPoint = [[XYPoint alloc] init];
go.origin = myPoint;

myPoint.x = 250;
myPoint.y = 50;

NSLog(@"Origin values %i, %i", go.origin.x, go.origin.y);

myPoint.x = 100;
myPoint.y = 10;

NSLog(@"Origin values %i, %i", go.origin.x, go.origin.y);

Я понимаю, что значения происхождения не меняются.Но нужно ли мне в методе setOrigin: назначать его следующим образом:

_origin.x = pt.x 

и не так:

_origin = pt;

Спасибо всем.Я знаю, что это длинный вопрос.Я действительно пытался понять и также смотрел во многих местах, но я даже не знаю, что искать.Как вы называете это назначение?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Congrats!Вы обнаружили, что свойства Objective-C синтаксический сахар вокруг метода получения и метода установки.Поскольку свойство на самом деле не является полем объекта (так как x и y являются полями структуры CGPoint), изменение полей свойств объекта ничего не делает - код разрешен так, чтобы означать «получить значение»свойства, затем измените результирующую копию этого значения. "

Теперь вы можете chain свойство получать и устанавливать (например, anObject.widget.gear.speed *= 2), и вы можете chain field получает и устанавливает (например, myStructure.owner.uniqueID = rand()), и, как вы можете видеть, они выглядят практически одинаково.Но вы не можете смешивать и сочетать их.

Почему?

Ну, потому что ... вы не можете.И это в значительной степени так.Таким образом, в будущем, если у вас возникнут подобные проблемы, проверьте, не смешиваете ли вы свойства и поля и смешиваете ли вы их.Если это так, вам придется разбить его на части:

CGPoint pt = go.origin;
pt.x += 300;
pt.y -= 100;
go.origin = pt;
0 голосов
/ 19 августа 2010
@property int x;
@property int y;

... должно быть ...

@property (nonatomic, readwrite) int x;
@property (nonatomic, readwrite) int y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...