"无法强制打开非可选类型的值' Int'"错误?

时间:2015-09-17 15:17:32

标签: swift

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))

任何人都可以解释为什么以及如何解决这个问题?

2 个答案:

答案 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