установка и использование obj-c CGPoint, CGRect и других - PullRequest
5 голосов
/ 21 ноября 2010

У меня есть три вопроса относительно того, что я считаю темой структур в obj-c

1) Почему я часто (или всегда) не могу взять член var, который является CGPoint или CGRect, и установить значения одно за другим? Я считаю, что я должен сделать:

CGPoint point;
point.x = someValue;
point.y = someOtherValue;
obj.myPoint = point;

вместо простого obj.myPoint.x = someValue и т. Д.

2) Является ли это поведение одинаковым для всех структур в obj-c?

3) Есть ли простой способ добавить две CGPoints? Кажется, что уже должно быть, но я не мог найти один. Я подумал, что было бы обременительно, если бы мне пришлось использовать временную CGPoint для накопления значений между двумя CGPoints перед установкой dest var в temp var (из-за невозможности просто выполнить pointA.x + = pointB.x ( то же самое для y).

Ответы [ 2 ]

11 голосов
/ 21 ноября 2010

1) От @sb в ответе на Назначение структуры свойства C объекта Cocoa Objective-c не удается

Это ничего не даст, потому что [t member] возвращает astruct, которая является "r-значением", т.е.значение, которое допустимо только для использования в правой части назначения.У него есть значение, но пытаться изменить это значение бессмысленно.

По сути, вам просто нужно смириться с тем фактом, что вы не можете установить поля struct напрямую при возврате из функции.

2) Да

3) К сожалению, я не думаю, что есть встроенный удобный метод для добавления двух CGPoint.Если вы делаете это часто, вы можете сделать свое собственное:

CGPoint CGPointAdd(CGPoint p1, CGPoint p2)
{
    return CGPointMake(p1.x + p2.x, p1.y + p2.y);
}  

, а затем использовать его как:

obj.pointA = CGPointAdd(obj.pointA, pointB);

не так элегантно, как obj.pointA.X += ... но иногда жизнь не справедлива.

0 голосов
/ 21 ноября 2010

Это совершенно нормально.'Obj' владеет этим var и имеет методы получения и установки, вы не можете изменять части этой переменной.

Лучше всего скопировать структуру и изменить все, что вам нужно.обратите внимание, что вы можете использовать функцию CGPointMake (x, y) (и то же самое для всех структур CG), что намного проще.

Обновить это проще всего:C 2.0 скрывает геттеры и сеттеры, которые выглядят так:

CGPoint point = [obj myPoint];
point.x += 10.0f;
[obj setMyPoint:point];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...