Как проверить, инициализирован ли CGSize (или его значение отличается от "nil")

У меня есть свойство CGSize в классе, и мне нужно проверить, было ли оно инициализировано. Я знаю, что CGSize не является объектом, но, вообще говоря, это та же идея проверки, если объект отличается от нуля. Как это сделать?

3 ответа

Решение

Это зависит от того, что вы подразумеваете под "в классе". Если это переменная экземпляра, ваши проблемы закончились, потому что вы гарантированно, что переменная экземпляра будет автоматически инициализирована к некоторой форме нуля (т.е. CGSizeZero). Но если вы просто имеете в виду "где-то в моем коде", например, автоматическую переменную, то такого теста нет; это полностью зависит от вас, чтобы инициализировать перед использованием, и до тех пор, пока вы не сделаете это, значение может быть любым (извините, но так работает C).

В целом, ваш вопрос сам по себе является "неприятным запахом". Если в какой-то момент кода вам будет важно, было ли инициализировано это значение, значит, вы делаете это неправильно. Это твоя ценность; это было до вас, чтобы инициализировать его (например, когда ваш общий объект был инициализирован). Или, если по какой-то причине вам необходимо знать, был ли когда-либо вызван ваш установщик, тогда вам нужно добавить логическое значение в ваш установщик, которое сообщает, вызывался ли он когда-либо.

Вы можете сравнить его с CGSizeZero или произвольным размером, который вы считаете недействительным.

if (!CGSizeEqualToSize(CGSizeZero, mySize) {
   // do something
}

CGSize является структурой Си За некоторыми исключениями (при использовании в качестве iVar), нет гарантии для его инициализированного значения. Это может быть что угодно, особенно при создании в стеке.

Таким образом, вы несете ответственность за его правильную инициализацию, и, поскольку "нули" являются допустимыми значениями, не существует гарантированного способа определить, было ли оно намеренно установлено в "ноль" или оно не было инициализировано.

Другие вопросы по тегам