func decideLeapYear(year: Int) -> Bool{
var lyear: Bool = false
if(year<1582){
if(((year/4)%1)==0){
lyear = true
}
}
else if(year>=1582)
{
if(((year%4)==0) || (year%400==0) && ((year%100)!=0)){
lyear = true
}
}
return lyear
}
在if
语句中的else if
语句结束时,Xcode会抛出此错误:
无法强制打开非可选类型的值&#39; Int&#39;
当它到达声明时:
((year%100)!=0))
任何人都可以解释为什么以及如何解决这个问题?
答案 0 :(得分:5)
这是因为编译器认为((year%100)!=0))
实际上是((year%100)! = 0))
,因此尝试解包(year%100)!
。
解决方案是在!=
之前添加空格:
func decideLeapYear(year: Int) -> Bool{
var lyear: Bool = false
if(year<1582){
if(((year/4)%1)==0){
lyear = true
}
}
else if(year>=1582)
{
if(((year%4)==0) || (year%400==0) && ((year%100) != 0)) {
lyear = true
}
}
return lyear
}
另外,只需注意:您不需要将条件括在括号中,代码中的空格字符也不需要任何费用。所以我建议你的代码添加一些空气:
func decideLeapYear(year: Int) -> Bool {
if year < 1582 {
if (year / 4) % 1 == 0 {
return true
}
} else if year >= 1582 {
if year % 4 == 0 || year % 400 == 0 && year % 100 != 0 {
return true
}
}
return false
}
我还删除了bool变量,使代码更清晰。
答案 1 :(得分:2)
func isLeapYear(year:Int) -> Bool {
return year < 1582 ? year % 4 == 0 : year % 4 == 0 && (year % 100 != 0 || (year % 400 == 0))
}
isLeapYear(2000) // true
isLeapYear(2400) // true
isLeapYear(1800) // false
isLeapYear(1900) // false
isLeapYear(2100) // false
isLeapYear(2200) // false
isLeapYear(2300) // false
isLeapYear(2500) // false
isLeapYear(2008) // true
isLeapYear(2012) // true
isLeapYear(2016) // true
isLeapYear(2017) // false
isLeapYear(2018) // false
isLeapYear(2019) // false
isLeapYear(2020) // true
或作为NSDate扩展:
extension NSDate {
var year: Int {
return NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!.component(.Year, fromDate: self)
}
var isLeapYear: Bool {
return year < 1582 ? year % 4 == 0 : year%4 == 0 && (year%100 != 0 || (year%400 == 0))
}
}
NSDate().isLeapYear // false
NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!.dateWithEra(1, year: 2016, month: 1, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)!.isLeapYear // true