Смешивание структур C и Objective C Свойства - PullRequest
1 голос
/ 05 декабря 2010

Я определил объект с помощью ивара CGPoint и связанного свойства следующим образом ...

@interface Sprite : NSObject {
 CGRect boundingBox;
}
@property(assign) CGRect boundingBox;

Когда я использую экземпляр класса Sprite и пытаюсь обновить структуру boundingBox следующим образом ...

self.boundingBox.origin.x = minX;

Я получаю ошибку времени компиляции, утверждающую ...

Требуется L-значение в качестве левого операнда присваивания

Правильно ли я говорю, чтоself.boundingBox вернет структуру C, которая на самом деле не является структурой, хранящейся в объекте Sprite, а является ее копией?Следовательно, когда присвоение нового значения для x не удается, поскольку структура является только временной копией?

Если это так, будет ли следующий код работать правильно (и это правильный способ достижения того, чего я хочу)?

CGRect newBoundingBox = self.boundingBox;
newBoundingBox.origin.x = self.boundingBox.origin.x;
self.boundingBox = newBoundingBox;

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

Помните, что свойства - это просто псевдонимы синтаксиса для методов установки и получения.Это:

self.boundingBox = newBox;

Эквивалентно этому:

[self setBoundingBox:newBox];

Причина, по которой вы не можете сделать это:

self.boundingBox.origin.x = minX;

Это потому, что нет возможности позвонитьsetBoundingBox:, но только попросите его изменить origin.x, и нет отдельных методов установки, доступных для отдельных частей структуры.Пример в конце вашего вопроса - единственный способ достичь того, что вы пытаетесь, с помощью свойств.

Вы можете забыть о свойствах и сделать это:

boundingBox.origin.x = minX

Этозаписывает непосредственно в текущие объекты boundingBox переменную экземпляра (при условии, что она существует), но игнорирует метод установки, что может быть нежелательно.

1 голос
/ 05 декабря 2010

ОТДАЛЕННЫЙ ОТВЕТ: Мой первоначальный комментарий о невозможности редактирования любого CGRect был неверным; настоящая проблема с первой строкой кода связана с тем, что вы используете self.boundingBox для доступа к CGRect. Ваш второй код будет отлично работать вместе с блоком, который был у меня в исходном ответе:

Чтобы правильно изменить значения внутри boundingBox, вам нужно использовать функцию CGRectMake яблока, например:

CGRect r = self.boundingBox;
self.boundingBox = CGRectMake(minX, r.y, r.width, r.height);

Для хорошего объяснения того, почему нотация self. является проблемой со структурами, ознакомьтесь с ответами на этот вопрос . Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...