2017-12-22 8 views
0

Ich habe ein Problem in Code-Kämpfe. Ich erhalte einen Fehler:Wie kann ich eine Funktion erstellen, um das Jahrhundert aus dem Jahr in Swift zurückzugeben?

declaration is only valid at file scope (extension Decimal)

Kann mir bitte jemand sagen, wie ich das beheben kann? BTW Ich erstelle eine Funktion, um das Jahrhundert mit dem Jahr als Eingabe zurückzugeben. Wenn Sie irgendwelche Empfehlungen für meinen Code haben, lassen Sie es mich wissen.

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

Die Der Fehler ist klar. Sie können keine Erweiterung in einer Funktion deklarieren. – rmaddy

Antwort

0

Neben der Tatsache, dass Sie nicht eine Erweiterung innerhalb einer Funktion deklarieren können, müssen Sie FloatingPoint statt Decimal zu verlängern. Fügen Sie einfach eine neue Swift Datei zu Ihrem Projekt und fügen Sie dort die Erweiterung:

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

in Ihrer Methode Im Hinblick auf das Jahr Jahrhundert gibt es ein paar Fehler zu extrahieren. Zuerst sollten Sie nur durch 100 teilen, nachdem Sie Ihr Jahr in Double umgewandelt haben. Zweitens müssen Sie die abgerundete zurück, wenn das Ergebnis ganze Zahl sonst ist sie zurück, ohne Rundung und Erhöhen eines:

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

Testing:

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 
+0

Vielen Dank für das Feedback Ich werde es in meinem Code implementieren :) –

+0

Sie sind willkommen –

1

Lösung ist sehr einfach:

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

Jahr plus 99? Sicherlich wäre 'Jahr/100 + 1' direkter? Außerdem müssen Sie mit der Rundung umgehen. – Fogmeister

+0

Haben Sie die obige Lösung ausprobiert? Ich versichere Ihnen, dass es in jedem Szenario passt. Das Runden ist implizit von Intcast. –

+0

vielleicht. Aber es scheint seltsam, 99 zuerst hinzuzufügen und nicht 1 danach hinzuzufügen. – Fogmeister

Verwandte Themen