Я пытаюсь протестировать, если свойство было установлено уже. Я знаю, что с объектами, которые я имею:
CGRect ppGoalFrame;
LocalPlaySetup *localPlaySetup;
и я могу протестировать
if (localPlaySetup == nil)
но если я пытаюсь протестировать CGRect с == ноль или == ПУСТОЙ УКАЗАТЕЛЬ
if (ppGoalFrame == nil)
Я добираюсь
invalid operands to binary == (have 'CGRect' and 'void *')
Так CGRect
"пусто", пустой указатель, ноль...? прежде чем это будет установлено? Очевидно, я не могу сравнить CGrect с пустым указателем (я не могу использовать ppGoalFrame == void
); там другой путь состоит в том, чтобы протестировать это? Objective C до сих пор довольно легко понять, но как только C вырисовывается, я становлюсь немного потерянным.
Только указатели могут быть нулевыми. CGRect - это структура, она представляет собой непрерывный блок памяти. Единственный способ узнать, настроен ли он, это проверить его содержимое.
Apple предоставляет константу CGRectNull
. Вы можете установить для своей переменной это значение и использовать функцию CGRectIsNull, чтобы определить, установлена ли она. CGRectNull
не то же самое, что CGRectZero
, поэтому вам не нужно беспокоиться, если желаемое значение равно нулю.
Обратите внимание, что CGRectNull просто содержит структуру CGRect, заполненную значениями, которые Apple позже может идентифицировать для функции CGRectIsNull. Это не то же самое, что при сравнении указателей.
Все переменные экземпляра в классе Objective-C инициализируются нулем. Поэтому все указатели равны nil
, числа равны 0, а структуры обнулены. Поскольку CGRect - это обычная структура, она будет инициализирована origin.x=0, origin.y=0, size.width=0, size.height=0
.
Поэтому, чтобы проверить, установлен ли ваш CGRect
, нужно сравнить его (по значению) с нулем. Функция CGRectIsEmpty
сделает именно это:
if (CGRectIsEmpty(ppGoalFrame))
{
// ...
}
Не существует универсального значения "ничего". Есть nil
для объектов и NULL
для указателей, но нет эквивалента для простых типов значений - они всегда имеют какое-то значение, даже если это просто бессмыслица. Вы можете взять произвольное значение и сказать: "Я назову его нулевым значением для этого типа" (скажем, #define IntNull 4444444
и надеяться, что некоторые вычисления никогда случайно не вернут это значение), но реального нулевого значения не существует.
В случае с CGRect, в частности, Apple использовала тактику "выбрать произвольное значение" и определила CGRectNull
, но переменные CGRect не устанавливаются на это значение по умолчанию - вы должны задать его сами. По умолчанию переменные экземпляра CGRect установлены в CGRectZero
, но помните, что это обычная структура CGRect в местоположении (0,0) с 0 шириной и 0 высотой. А локальные CGRect в функции имеют совершенно непредсказуемое значение.
Я не думаю, что вы можете провести двоичное сравнение структуры C, которая то же, что CGRect . Быстрый поиск в Google и проверка настольного справочника C для чайников ничего не дали. Вы можете объявить CGRect ppGoalFrame, инициализировать элементы структуры значениями по умолчанию (если они еще не были) и протестировать элементы структуры.
Обновление редактирования: этот вопрос был задан для структур C.