首页 文章

“无法强制解包非可选类型'Int'的值”错误?

提问于
浏览
2
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
}

else if 语句的 if 语句末尾,Xcode抛出此错误:

无法强制解包非可选类型'Int'的值

当它到达声明时:

((year%100)!=0))

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

2 回答

  • 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变量,使代码更清晰 .

  • 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
    

相关问题