Para a primeira parte, use a resposta de @kperryua para construir os objetos NSDate com os quais deseja comparar. Com base na sua resposta à sua própria pergunta, parece que você já descobriu isso.
Para realmente comparar as datas, concordo totalmente com o comentário de @Tim sobre sua resposta. É mais conciso, mas na verdade exatamente equivalente ao seu código, e explicarei por quê.
+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
Embora possa parecer que a instrução return deve avaliar ambos os operandos do operador &&, este não é realmente o caso. A chave é " avaliação de curto-circuito ", que é implementada em uma ampla variedade de linguagens de programação, e certamente em C. Basicamente, os operadores &
e &&
"curto-circuito" se o primeiro argumento for 0 (ou NÃO, nulo, etc.) , while |
e ||
faça o mesmo se o primeiro argumento não for 0. Se date
vier antes beginDate
, o teste retorna NO
sem nem mesmo precisar comparar com endDate
. Basicamente, ele faz a mesma coisa que seu código, mas em uma única instrução em uma linha, não 5 (ou 7, com espaço em branco).
A intenção é ser uma entrada construtiva, pois, quando os programadores entendem a maneira como sua linguagem de programação particular avalia as expressões lógicas, eles podem construí-las de maneira mais eficaz, sem tanto esforço. No entanto, existem testes semelhantes que seriam menos eficientes, uma vez que nem todos os operadores entram em curto-circuito. (Na verdade, a maioria não pode entrar em curto-circuito, como operadores de comparação numérica.) Em caso de dúvida, é sempre seguro ser explícito ao quebrar sua lógica, mas o código pode ser muito mais legível quando você deixa a linguagem / compilador lidar com as pequenas coisas para voce.