Значение по умолчанию структуры Objective C и как проверить - PullRequest
38 голосов
/ 10 марта 2010

Я пытаюсь проверить, было ли свойство установлено. Я знаю, что с объектами, которые у меня есть:

CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;

и я могу проверить

if (localPlaySetup == nil)

но если я попытаюсь проверить CGRect с == nil или == NULL

if (ppGoalFrame == nil)

Я получаю

invalid operands to binary == (have 'CGRect' and 'void *')

Так что же, CGRect "пустота", ноль, ноль ...? до того, как это установлено? Очевидно, я не могу сравнить CGrect с пустым указателем (я не могу использовать ppGoalFrame == void); Есть ли другой способ проверить это? До сих пор Objective-C довольно легко понять, но как только вырисовывается C, я немного теряюсь.

Ответы [ 7 ]

88 голосов
/ 10 марта 2010

Только указатели могут быть нулевыми. CGRect - это структура - она ​​представляет собой непрерывный блок памяти. Единственный способ узнать, установлен ли он, чтобы проверить его содержимое.

Apple обеспечивает постоянную CGRectNull. Вы можете установить эту переменную на это и использовать функцию CGRectIsNull, чтобы определить, была ли она установлена. CGRectNull - это не то же самое, что CGRectZero, поэтому вам не нужно беспокоиться, если желаемое значение равно нулю.

Обратите внимание, что CGRectNull просто содержит структуру CGRect, заполненную значениями, которые Apple может позже идентифицировать для функции CGRectIsNull. Это не то же самое, что и при сравнении указателей.

45 голосов
/ 10 марта 2010

Все переменные экземпляра в классе Objective C инициализируются нулем. Таким образом, все указатели nil, числа 0, а структуры обнуляются. Поскольку CGRect является простой структурой, она будет инициализирована как origin.x=0, origin.y=0, size.width=0, size.height=0.

Таким образом, чтобы проверить, установлен ли ваш CGRect, вам нужно сравнить его (по значению) с нулем. Функция CGRectIsEmpty сделает именно это:

if (CGRectIsEmpty(ppGoalFrame))
{
    // ...
}
5 голосов
/ 07 ноября 2011

С CGGeometry.h:

/* Return true if `rect' is empty (that is, if it has zero width or height),
   false otherwise. A null rect is defined to be empty. */

пустой прямоугольник - это прямоугольник, который не имеет области, где на обеих сторонах ноль Используйте вместо:

CGRect newRect = CGRectNull;
2 голосов
/ 01 апреля 2013

Вы также можете перенести CGRect в NSValue:

[NSValue valueWithCGRect:CGRectMake(x, y, width, height)]

А затем избегайте значения nil.

2 голосов
/ 10 марта 2010

Универсального значения «ничего» не существует. Есть nil для объектов и NULL для указателей, но нет эквивалента для простых значений - у них всегда есть некоторое значение, даже если это просто чепуха. Вы можете взять произвольное значение и сказать «Я собираюсь назвать это нулевое значение для этого типа» (скажем, #define IntNull 4444444 и надеемся, что некоторые вычисления никогда не вернут случайное значение), но реального нулевого значения нет.

В частности, в случае с CGRect, Apple использовала тактику «выбрать произвольное значение» и определила CGRectNull, но переменные CGRect по умолчанию не установлены на это - вы должны специально установить это самостоятельно. По умолчанию переменные экземпляра CGRect установлены на CGRectZero, но помните, что это просто обычная структура CGRect в местоположении (0,0) с 0 шириной и 0 высотой. А локальные CGRects в функции имеют совершенно непредсказуемое значение.

0 голосов
/ 28 апреля 2019

На самом деле есть очевидное и элегантное решение (смеется):

SomeStruct someStruct = {0};

Который просто заполняет все "элементы" структуры нулями.

0 голосов
/ 10 марта 2010

Я не думаю, что вы можете сделать двоичное сравнение структуры C, которая равна , что такое CGRect . Быстрый поиск в Google и проверка справки C For Dummies ничего не нашли. Вы можете объявить CGRect ppGoalFrame, инициализировать элементы структуры значениями по умолчанию (если они еще не установлены) и протестировать элементы структуры.

Обновить Редактировать: Этот вопрос был задан для структур С.

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