Значение по умолчанию структуры Objective C и как протестировать

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

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 вырисовывается, я становлюсь немного потерянным.

38
задан typeoneerror 10 March 2010 в 05:48
поделиться

4 ответа

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

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

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

89
ответ дан 27 November 2019 в 03:00
поделиться

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

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

if (CGRectIsEmpty(ppGoalFrame))
{
    // ...
}
45
ответ дан 27 November 2019 в 03:00
поделиться

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

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

2
ответ дан 27 November 2019 в 03:00
поделиться

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

Обновление редактирования: этот вопрос был задан для структур C.

0
ответ дан 27 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: