2017-09-01 7 views
1

私は因子を計算するコードを持っています。拡張機能 - エラー(Swift3)

私は 拡張を使用して別のファイル「文字列+ Factorial.swift」からこれをやろうとしているが、私はエラーを取得します。

どうすれば削除できますか?まだ拡張

ViewController.swift

@IBAction func FactorialButton(_ sender: UIButton) { 
    currentInput = factorial(currentInput: currentInput) 
} 

文字列+ Factorial.swift

import Foundation 

extension Double { 

func factorial(currentInput: Double) -> Double { 
    if currentInput >= 0 { 
     return currentInput == 0 ? 1 : currentInput * self.factorial(currentInput: currentInput - 1) 
    } else { 
     return 0/0 
    } 
    } 
} 
+2

コール 'currentInput = currentInput.factorial(currentInput:currentInput)' –

+0

1簡単な質問ならば二重の値を '3.0 'として送信しました。あなたはOPを6.0と正しく受け取るか、そうでなければ –

答えて

4

拡張機能の概念が間違っているようです。既存の型を関数で拡張すると、その関数はその型のインスタンス関数になります(もちろん、それをクラス/静的関数として定義しない限り)ので、そのクラスのインスタンスで関数を呼び出す必要があります。あなたのケースでは

、あなたはこのようなcurrentInputfactorialを呼び出す必要があります:
currentInput = currentInput.factorial(currentInput: currentInput)

0

で解体されていない

は、それが動作します 、このコードを使用してみてください細かい

@IBAction func FactorialButton(_ sender: UIButton) { 
currentInput = currentInput.factorial(currentInput: currentInput)} 
1

私はあなたが何であるかを拡張誤解だと思います。

あなたはDouble拡張内factorial方法を持っている場合、あなたはそのようにそれを使用することができます:

6.0.factorial() 

好きない:

factorial(currentInput: 6.0) 

あなたの現在の方法は、両方を行うことをしようとします。現在の方法は、次のようにしか使用できません:

6.0.factorial(currentInput: 6.0) 

ほとんど意味がありません。

これは、これを実装した方法です。すべてのcurrentInputselfに置き換えているか

func factorial() -> Double { 
    if self >= 0 { 
    return self == 0 ? 1 : self * (self - 1).factorial() 
    } else { 
    return 0/0 
    } 
} 

注意。 Doubleの内線番号のselfは、メソッドを呼び出す倍精度の倍数です。しかし、Double上の階乗をしていることは、私の意見では少し奇妙です

currentInput.factorial() 

今、あなたはこのようにそれを呼び出すことができます。 Doubleが不正確で、1を何度も減算すると、この不正確さが明らかになります。あなたは0の代わりに-0.0000000000000001を最終的に得るかもしれません。これにより、>= 0が失敗し、NaNが返されます。

これが私の意見ですが、私はグローバル関数としてfactorialをしていることは、このように、より読みやすいと思う:

factorial(6.0)