У меня возникли проблемы с пониманием кода ниже. Он включает сеттер с оператором if, который требует, чтобы переменная начала была равна нулю (false) перед выполнением.Отрицательная логика оператора не имеет смысла
Оператор отрицанием в, если заявление требует происхождения равным нулю (ложь), чтобы выполнить, как же оно выполняется после происхождения присваивается значение.
/**implementation file **/
-(void) setOrigin : (XYPoint *) pt
{
if (! origin)
origin = [[XYPoint alloc] init];
origin.x = pt.x;
origin.y = pt.y;
}
/** Main file **/
myPoint.x = 2;
myPoint.y = 3;
shape1.origin= myPoint;
myPoint.x = 2;
myPoint.y = 3;
shape1.origin= myPoint;
}
myRect.origin = myPoint;
^^ При первом появлении этого метода метод выполняется, поскольку переменная экземпляра равна нулю и (! Origin) действительна.
Однако, если я изменяю значения myPoint в следующей строке и снова устанавливаю myRect.origin = myPoint, метод setter не должен работать, потому что (! Origin) больше не является истинным, потому что он уже содержит ненулевое значение из предыдущего выполнения. Почему он все еще выполняется, несмотря на эту логику? Я ошибаюсь?
Вы понимаете, что выражение 'if' влияет только на следующую строку, верно? – Kevin
Эй, @kevin, я думаю, что я где-то читал, что отступы в объективе C имеют большое значение, если вы не используете скобки в своих операторах if/else. Поскольку origin.x = pt.x и origin.y = pt.y не имеют отступов в выражении if, не являются ли они частью инструкции if? – Brosef
Нет, отступы не имеют абсолютно никакой разницы в объективе c. Эти два не являются частью оператора 'if', потому что' if' влияет только на следующий оператор и ничего больше. Период. (Скобки считаются одним утверждением, независимо от того, сколько внутри них). – Kevin