#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…