如何确定Zodiac登录Objective-C

时间:2014-06-10 14:19:22

标签: ios objective-c date

我有以下代码:

NSDate *myDate = [datePickerControl date];
NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setDateFormat:@"dd-MM"];

NSString *getDate = [format stringFromDate:myDate];

NSArray *array = [NSArray arrayWithObjects:@"15-06",@"15-07",@"15-08",nil];

for (int i = 0; i < ([array count]); i++) {
    NSLog(@"i = %i", i);
    NSString *stringToCheck = (NSString *)[array objectAtIndex:i];

if ([getDate isEqualToString:stringToCheck]) {
    [signWow setText:[NSString stringWithFormat:@"Your sign is Scorpion"]];
}}

使用日期选择器确定出生日期,然后将日期与NSArray中的日期进行比较。但是,输入与特定十二生肖相关的所有日期太难了。 那么,是否可以制作一个包含例如02/12( dd / MM )和03/15之间所有日期的数组?

查看屏幕截图here

请提供一些代码,因为我是Objective-C的新手......:)

6 个答案:

答案 0 :(得分:2)

您不需要为每个标志输入每个日期。相反,请输入每个标志的开始和结束月份和日期的表格。

然后,您将获取用户选择的日期,使用Gregorian NSCalendar从日期中提取月份和日期单位,然后将用户输入的日期与每个符号的范围进行比较。

顺便说一下,它是“天蝎座”,而不是“蝎子”。

答案 1 :(得分:1)

这是最简单的方法。是的,它很长,是的,它不是最有效的,但它绝对是最容易理解的,而且它已经为你写了。干杯:)

P.S。这是热带十二生肖(标准,而不是基于印度教系统的恒星生肖),并且为了回应Zev,蛇夫座只影响了每个星座相应的星座,但是s及其日期不受影响。

以下是代码:

-(void)getZodiacFromBirthday {
    NSString *UserBirthday = @"09/09/99";
    NSArray *birthArray = [UserBirthday componentsSeparatedByString:@"/"];
    NSString *month = birthArray[0];
    NSString *day = birthArray[1];        
        if ([month isEqualToString:@"01"]) {
            if ([day intValue] >= 21) {
                sign = @"Aquarius";
            } else {
                sign = @"Capricorn";
            }
        } else if ([month isEqualToString:@"02"]) {
            if ([day intValue] >= 20) {
                sign = @"Pisces";
            } else {
                sign = @"Aquarius";
            }
        } else if ([month isEqualToString:@"03"]) {
            if ([day intValue] >= 21) {
                sign = @"Aries";
            } else {
                sign = @"Pisces";
            }
        } else if ([month isEqualToString:@"04"]) {
            if ([day intValue] >= 21) {
                sign = @"Taurus";
            } else {
                sign = @"Aries";
            }
        } else if ([month isEqualToString:@"05"]) {
            if ([day intValue] >= 22) {
                sign = @"Gemini";
            } else {
                sign = @"Taurus";
            }
        } else if ([month isEqualToString:@"06"]) {
            if ([day intValue] >= 22) {
                sign = @"Cancer";
            } else {
                sign = @"Gemini";
            }
        } else if ([month isEqualToString:@"07"]) {
            if ([day intValue] >= 23) {
                sign = @"Leo";
            } else {
                sign = @"Cancer";
            }
        } else if ([month isEqualToString:@"08"]) {
            if ([day intValue] >= 23) {
                sign = @"Virgo";
            } else {
                sign = @"Leo";
            }
        } else if ([month isEqualToString:@"09"]) {
            if ([day intValue] >= 24) {
                sign = @"Libra";
            } else {
                sign = @"Virgo";
            }
        } else if ([month isEqualToString:@"10"]) {
            if ([day intValue] >= 24) {
                sign = @"Scorpio";
            } else {
                sign = @"Libra";
            }
        } else if ([month isEqualToString:@"11"]) {
            if ([day intValue] >= 23) {
                sign = @"Sagittarius";
            } else {
                sign = @"Scorpio";
            }
        } else if ([month isEqualToString:@"12"]) {
            if ([day intValue] >= 22) {
                sign = @"Capricorn";
            } else {
                sign = @"Sagittarius";
            }
        }
        NSLog(@"Sign: %@", sign);
    }

答案 2 :(得分:1)

如何使用元组...(斯威夫特)

func getZodiacSign(_ date:Date) -> String{

    let calendar = Calendar.current
    let d = calendar.component(.day, from: date)
    let m = calendar.component(.month, from: date)

    switch (d,m) {
    case (21...31,1),(1...19,2):
        return "aquarius"
    case (20...29,2),(1...20,3):
        return "pisces"
    case (21...31,3),(1...20,4):
        return "aries"
    case (21...30,4),(1...21,5):
        return "taurus"
    case (22...31,5),(1...21,6):
        return "gemini"
    case (22...30,6),(1...22,7):
        return "cancer"
    case (23...31,7),(1...22,8):
        return "leo"
    case (23...31,8),(1...23,9):
        return "virgo"
    case (24...30,9),(1...23,10):
        return "libra"
    case (24...31,10),(1...22,11):
        return "scorpio"
    case (23...30,11),(1...21,12):
        return "sagittarius"
    default:
        return "capricorn"
    }

}

答案 3 :(得分:0)

Duncan是对的,当他回答问题时,我正在给你写一个示例代码......

//get date from your picker
NSDate *myDate = [datePickerControl date];

 NSCalendar *gregorianCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
 NSDateComponents *dateComps = [gregorianCal components: (NSDayCalendarUnit | NSMonthCalendarUnit)
                                                  fromDate: myDate];
    // Then use it
    int month=[dateComps month];
    int days=[dateComps day];

//I guess there is only two zodiac signs possilble for each month right?
switch (month)
{
    case 1:
    //compare the dates
    if (days<=20)
    {
        //user is Capricorn
    }
    else
    {
        //user is Picses
    }
    break;

    case 2:
    break;

    //you will  have 12 cases and each case will have an if else with corect dates.....

    default;
    break;
}

答案 4 :(得分:0)

对于那些使用swift的人,我必须感谢Duncan C.他的解决方案给了我很多帮助:

如果日期是“dd / MM / yyyy”

func getSignoZodiacal(date:String) -> String {

    let f = date.componentsSeparatedByString("/")
    let dia = Int(f[0])
    let mes = Int(f[1])

    if mes == 1 {
        if dia >= 21 {
            return "Aquarius"
        }else {
            return "Capricorn"
        }
    }else if mes == 2 {
        if dia >= 20 {
            return "Picis"
        }else {
            return "Aquarius"
        }
    }else if mes == 3 {
        if dia >= 21 {
            return "Aries"
        }else {
            return "Pisces"
        }
    }else if mes == 4 {
        if dia >= 21 {
            return "Taurus"
        }else {
            return "Aries"
        }
    }else if mes == 5 {
        if dia >= 22 {
            return "Gemini"
        }else {
            return "Taurus"
        }
    }else if mes == 6 {
        if dia >= 22 {
            return "Cancer"
        }else {
            return "Gemini"
        }
    }else if mes == 7 {
        if dia >= 23 {
            return "Leo"
        }else {
            return "Cancer"
        }
    }else if mes == 8 {
        if dia >= 23 {
            return "Virgo"
        }else {
            return "Leo"
        }
    }else if mes == 9 {
        if dia >= 24 {
            return "Libra"
        }else {
            return "Virgo"
        }
    }else if mes == 10 {
        if dia >= 24 {
            return "Scorpio"
        }else {
            return "Libra"
        }
    }else if mes == 11 {
        if dia >= 23 {
            return "Sagittarius"
        }else {
            return "Scorpio"
        }
    }else if mes == 12 {
        if dia >= 22 {
            return "Capricorn"
        }else {
            return "Sagittarius"
        }
    }
    return ""
}

答案 5 :(得分:0)

以下是使用Swift的用户的答案。它基于Hendra Kusumah的元组解决方案,但使用扩展名和枚举来获得更整洁,更像Swift的答案。

用法

let date = Date()
date.zodiacSign // Enum value e.g. .aquarius
date.zodiacSign.rawValue // String value e.g. "aquarius"

注意-如果您希望字符串值大写或以其他方式出现,请使用date.zodiacSign.rawValue.capitalized操纵字符串或编辑ZodiacSign枚举大小写,例如case aquarius = "Aquarius"

扩展

extension Date {

    var zodiacSign: ZodiacSign {
        get {
            let calendar = Calendar.current
            let day = calendar.component(.day, from: self)
            let month = calendar.component(.month, from: self)

            switch (day, month) {
            case (21...31, 1), (1...19, 2):
                return .aquarius
            case (20...29, 2), (1...20, 3):
                return .pisces
            case (21...31, 3), (1...20, 4):
                return .aries
            case (21...30, 4), (1...21, 5):
                return .taurus
            case (22...31, 5), (1...21, 6):
                return .gemini
            case (22...30, 6), (1...22, 7):
                return .cancer
            case (23...31, 7), (1...22, 8):
                return .leo
            case (23...31, 8), (1...23, 9):
                return .virgo
            case (24...30, 9), (1...23, 10):
                return .libra
            case (24...31, 10), (1...22, 11):
                return .scorpio
            case (23...30, 11), (1...21, 12):
                return .sagittarius
            default:
                return .capricorn
            }
        }
    }

}

枚举

enum ZodiacSign: String {
    case aries
    case taurus
    case gemini
    case cancer
    case leo
    case virgo
    case libra
    case scorpio
    case sagittarius
    case capricorn
    case aquarius
    case pisces
}