扩展 - 错误 (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
进行阶乘有点奇怪。 Double
s 是不准确的,当你多次减去 1 时,这种不准确就会变得很明显。您最终可能会得到 -0.0000000000000001
而不是 0
。这将导致 >= 0
失败并且 return NaN.
这只是我的意见,但我认为将 factorial
作为全局函数更具可读性,如下所示:
factorial(6.0)
我有计算系数的代码。
我正在尝试从另一个文件“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
进行阶乘有点奇怪。 Double
s 是不准确的,当你多次减去 1 时,这种不准确就会变得很明显。您最终可能会得到 -0.0000000000000001
而不是 0
。这将导致 >= 0
失败并且 return NaN.
这只是我的意见,但我认为将 factorial
作为全局函数更具可读性,如下所示:
factorial(6.0)