繁体   English   中英

如何创建 function 以从 Swift 的年份返回世纪?

[英]How can I create a function to return the century from the year in Swift?

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

声明仅在文件 scope 中有效(扩展十进制)

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

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

解决方法很简单:

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

除了不能在函数内声明扩展这一事实之外,您还需要扩展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

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

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

有几种方法,

你可以这样做

操作1

func century(_ year: Double) -> String {
    var century = Int((year / 100).rounded(.up))
    if century != 21 {
    return "\(century)th century"
    } else {
    return "21st century"
    }
}

Op2

func century(_ year: Int) -> String {
    switch year {
    case 901...1000: return "10th century"
    case 1001...1100: return "11th century"
    case 1101...1200: return "12th century"
    case 1201...1300: return "13th century"
    case 1301...1400: return "14th century"
    case 1401...1500: return "15th century"
    case 1501...1600: return "16th century"
    case 1601...1700: return "17th century"
    case 1701...1800: return "18th century"
    case 1801...1900: return "19th century"
    case 1901...2000: return "20th century"
    case 2001...2100: return "21st century"
    default: return ""
    }
}
func centuryFromYear(year: Int) -> Int {
    return 1 + Int((year - 1) / 100)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM