[英]How to create a nested Encodable class and return it from a function in 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.