我在代码争斗中遇到了问题。我收到一个错误:
声明仅在文件范围内有效(扩展名为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)
}
}
}
答案 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
}
}