2017-12-22 6 views
0

私はコード戦で問題があります。エラーが発生しました:スウィフトで今年の世紀を返す関数を作成するにはどうすればよいですか?

declaration is only valid at file scope (extension Decimal)

誰かがこの問題を解決する方法を教えてください。 BTW私は入力として年と世紀を返す関数を作成しています。私のコードの推奨事項があれば教えてください。あなたが関数内で拡張を宣言することができないという事実のほかに

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

エラーはクリアです。関数内に拡張を宣言することはできません。 – rmaddy

答えて

0

、あなたはFloatingPoint代わりのDecimalを拡張する必要があります。ちょうどあなたのプロジェクトに新しいスウィフトファイルを追加し、そこに拡張子を追加します。

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

年の世紀を抽出するためにあなたの方法にについては、いくつかの誤りがあります。まず、年を二重に変換した後で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 
+0

フィードバックありがとう私は私のコードでそれを実装します:) –

+0

あなたは歓迎です –

1

ソリューションは非常に簡単です:

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

年プラス99?確かに「年/ 100 + 1」はもっと真っ直ぐだろうか?また、丸め処理が必要です。 – Fogmeister

+0

上記の解決策を試しましたか?私はそれがあらゆるシナリオに適合することを保証します。丸めはIntキャストから暗黙的に行われます。 –

+0

かもしれません。しかし、最初に99を追加して1を追加するのは奇妙に思えます。 – Fogmeister

関連する問題