如何在Swift中创建一个函数来回归一年中的世纪?

时间:2017-12-22 02:45:55

标签: swift scope

我在代码争斗中遇到了问题。我收到一个错误:

  

声明仅在文件范围内有效(扩展名为Decimal)

有人可以指导我如何解决这个问题吗?顺便说一下,我正在创建一个以年份作为输入来回归世纪的功能。如果您对我的代码有任何建议,请告诉我。

func centuryFromYear(year: Int) -> Int {
    let centuryOtherStart = year / 100
    let centuryStart = Double(year / 100)
    let centuryEnd = round(centuryStart)
    var wholeNumber : Bool
    if wholeNumber == true {
        return Int(centuryStart)

    } else {
        return Int(centuryEnd + 1)
    }

    extension Decimal {
        var isWholeNumber: Bool {
            wholeNumber = self.isZero || (self.isNormal && self.exponent >= 0)
        }
    }
}

3 个答案:

答案 0 :(得分:2)

解决方案非常简单:

func centuryFromYear(year: Int) -> Int {    
    return (year + 99) / 100
}

答案 1 :(得分:1)

除了您无法在函数内声明扩展名外,您还需要扩展FloatingPoint而不是Decimal。只需在项目中添加一个新的Swift文件,然后在那里添加扩展名:

extension FloatingPoint {
    var isWholeNumber: Bool {
        return isZero ? true : isNormal ? self == rounded() : false
    }
}

关于提取年份的方法,有一些错误。首先,在将您的年份转换为Double后,您应该除以100。其次,如果结果是整数,则需要返回四舍五入,否则返回它而不进行舍入并递增一个:

func centuryFrom(year: Int) -> Int {
    let centuryStart = Double(year)/100
    return centuryStart.isWholeNumber ? Int(round(centuryStart)) : Int(centuryStart) + 1
}

测试:

centuryFrom(year: 1801)   // XIX
centuryFrom(year: 1900)   // XIX
centuryFrom(year: 1901)   // XX
centuryFrom(year: 2000)   // XX
centuryFrom(year: 2001)   // XXI
centuryFrom(year: 2100)   // XXI
centuryFrom(year: 2101)   // XXII

答案 2 :(得分:0)

我可能会迟到。但也试试这个

    func centuryFromYear(year: Int) -> Int {
        if year % 100 == 0 {
//this will return exact century like 2000 means 20th Century
            return year / 100 
        }else {
//this will return exact century like 2001 means 20th Century

            return year / 100 + 1   
        }
    }