2017-09-01 185 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

一個簡單的問題,如果你發送了「3.0」的double值,你得到的OP爲6.0,否則 –

回答

4

看起來好像你誤解了擴展的概念。如果使用函數擴展現有類型,那麼該函數將是該類型的實例函數(除非您將其定義爲類/靜態函數),因此您需要在類的實例上調用該函數。

在你的情況,你需要調用factorialcurrentInput這樣的:
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) 

這沒什麼意義。

這是你應該如何實現它的。

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

請注意如何將每個currentInput替換爲self。在一個Double擴展中,self是一個雙精度型,您正在調用該方法。

現在你可以這樣調用:

currentInput.factorial() 

然而,在Double做一個階乘在我看來有點不可思議。 Double s是不準確的,當你減去1很多次這個不準確性變得明顯。最終可能會得到-0.0000000000000001,而不是0。這將導致>= 0失敗並返回NaN。

這只是我的看法,但我認爲這樣做factorial作爲一個全球性的功能更可讀的,就像這樣:

factorial(6.0)