Objective-C:简单的if x == y ||的问题 y || y命令

n.e*_*ind 2 iphone cocoa-touch if-statement objective-c

我有一个字符串(包含一个月),并想检查它是一个'短'月(根据名称的长度)还是'月'名称.根据名称的长度,我想设置它的位置:

    NSString* dateMonth = @"SEPTEMPER";
if (dateMonth == @"MARCH" || @"APRIL" || @"MAY" || @"JUNE" || @"JULY") {

    CGRect calendarFrame = CGRectMake(170+100, 8, 200, 50);
    calendar1 = [[UIView alloc] initWithFrame:calendarFrame];
    calendar1.clipsToBounds = true;

} else {

    CGRect calendarFrame = CGRectMake(170,     8, 200, 50);
    calendar1 = [[UIView alloc] initWithFrame:calendarFrame];
    calendar1.clipsToBounds = true;

}
Run Code Online (Sandbox Code Playgroud)

这种情况最终应该在ELSE函数中,但它不会...我最终得到170 + 100的位置.

我究竟做错了什么?任何帮助将非常感谢.

Nik*_*bak 5

这段代码

if (dateMonth == @"MARCH" || @"APRIL") {
Run Code Online (Sandbox Code Playgroud)

实际上被评估为

if ((dateMonth == @"MARCH") || (@"APRIL")) {
Run Code Online (Sandbox Code Playgroud)

并且由于@"APRIL"不是零或零,它被评估为TRUE.

可以做些什么

  • 第1步(部分修复)

    if ((dateMonth == @"MARCH") || (dateMonth == @"APRIL")) {
    
    Run Code Online (Sandbox Code Playgroud)
  • 第2步(这已经有效)
    使用isEqual方法来比较字符串(或任何其他对象)而不是==.isEqualToString也像其他人建议的那样有效.

  • 第3步(额外英里)
    您可以通过使用set使其更具可读性(并且更简单).

    NSSet *shortMonths = [NSSet setWithObjects:@"MARCH", @"APRIL", @"MAY", nil];
    if ([shortMonths containsObject:@"APRIL"]) {
    
    Run Code Online (Sandbox Code Playgroud)