2017-09-01 140 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)