Как проверить, что свойство float управляемого объекта равно нулю?

#objective-c #cocoa-touch

#objective-c #cocoa-touch

Вопрос:

Score — это NSManagedObject. score.latitude — это NSNumber , который на самом деле является значением с плавающей точкой.

 NSLog(@"%f", [score.latitude floatValue]);
  

показывает 0.000000.

Конструкция, которую я использую для проверки на ноль:

если (score.latitude == nil)

не работает.

Ответ №1:

Не имеет значения, что в вашем экземпляре хранится значение с плавающей запятой NSNumber ; сам объект либо есть nil , либо нет. Для проверки наличия объекта nil , if( obj == nil ) функционально эквивалентно if( obj ) .

Таким образом, ваше условие может не выполнять то, что вы ожидаете, но оно проверяется nil . Вам нужно будет добавить более подробную информацию о том, что происходит в теле if , если вам нужно более конкретное объяснение.

Ключевым моментом является то, что отправка сообщения nil , такого как [nil floatValue] always returns 0 , интерпретируется как любой возвращаемый тип метода. Например, если вы отправите floatValue в nil , вы получите обратно значение 0 с плавающей запятой. Если вы отправите сообщение, которое должно возвращать объект, вы получите nil ; сообщение, которое должно возвращать an int , вы получите целое число 0 .

Также имейте в виду, что когда вы говорите if( score.latitude ) , выражение будет оценивать false, если либо score или latitude равно nil (потому что, если score есть nil , отправка latitude на него вернется nil .)

Ответ №2:

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

И NSNumber не является значением с плавающей запятой, но имеет метод, который возвращает значение с плавающей запятой.

используется if (score) для проверки, был ли экземпляр NSNumber создан ранее.

Ответ №3:

Как я наконец понимаю, проблема заключается в том, что Core Data сохраняет данные в базе данных sql, которая хранит нулевые свойства как 0.000…