Для першої частини використовуйте відповідь від @kperryua для побудови об’єктів NSDate, з якими потрібно порівняти. З вашої відповіді на власне запитання, схоже, ви це зрозуміли.
Для фактичного порівняння дат, я повністю погоджуюсь з коментарем @Tim щодо вашої відповіді. Це більш стисло, але насправді точно еквівалентно вашому коду, і я поясню, чому.
+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
Хоча може здатися, що оператор return повинен оцінювати обидва операнди оператора &&, насправді це не так. Ключовим моментом є " оцінка короткого замикання ", яка реалізована в широкому спектрі мов програмування, і, безумовно, в C. В основному, оператори &
та &&
"коротке замикання", якщо перший аргумент дорівнює 0 (або НІ, нуль тощо). , while |
і ||
зробіть те саме, якщо перший аргумент не дорівнює 0. Якщо date
приходить раніше beginDate
, тест повертається, NO
навіть не потребуючи порівняння з endDate
. По суті, він робить те саме, що і ваш код, але в одному висловлюванні в одному рядку, а не 5 (або 7, з пробілами).
Це задумано як конструктивний вхід, оскільки, коли програмісти розуміють спосіб, яким їх конкретна мова програмування оцінює логічні вирази, вони можуть будувати їх ефективніше, не стільки про ефективність. Однак існують подібні тести, які були б менш ефективними, оскільки не у всіх операторів відбувається коротке замикання. (Дійсно, більшість не можуть замикати, наприклад, числові оператори порівняння.) Якщо ви сумніваєтесь, завжди можна бути чітким, розбиваючи свою логіку, але код може бути набагато зручнішим для читання, коли ви дозволяєте мові / компілятору обробляти дрібниці для вас.