扩展 - 错误 (Swift3)

Extension - Error (Swift3)

我有计算系数的代码。

我正在尝试从另一个文件“String+Factorial.swift”使用 Extension 但我收到错误消息。

如何删除?

尚未与扩展一起拆除

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
    }
  }
}

尝试使用此代码, 它会正常工作

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

你好像误解了扩展的概念。如果您使用函数扩展现有类型,该函数将是该类型的实例函数(当然除非您将其定义为 class/static 函数),因此您需要在 class.

在您的情况下,您需要像这样在 currentInput 上调用 factorial
currentInput = currentInput.factorial(currentInput: currentInput)

我想你误解了什么是扩展。

如果您在 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 进行阶乘有点奇怪。 Doubles 是不准确的,当你多次减去 1 时,这种不准确就会变得很明显。您最终可能会得到 -0.0000000000000001 而不是 0。这将导致 >= 0 失败并且 return NaN.

这只是我的意见,但我认为将 factorial 作为全局函数更具可读性,如下所示:

factorial(6.0)