【问题标题】:Extension - Error (Swift3)扩展 - 错误 (Swift3)
【发布时间】:2017-09-01 10:00:24
【问题描述】:

我有计算因子的代码。

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

如何删除它?

还没有通过扩展拆除

ViewController.swift

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

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

【问题讨论】:

  • 致电currentInput = currentInput.factorial(currentInput: currentInput)
  • 一个简单的问题,如果您将双精度值发送为3.0,您会得到正确的 6.0 OP,否则

标签: ios swift3 extension-methods


【解决方案1】:

您似乎误解了扩展的概念。如果您使用函数扩展现有类型,则该函数将是该类型的实例函数(当然,除非您将其定义为类/静态函数),因此您需要在类的实例上调用该函数。

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

【讨论】:

    【解决方案2】:

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

    如果您在 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 失败并返回 NaN。

    这只是我的看法,但我认为将factorial 作为一个全局函数更具可读性,像这样:

    factorial(6.0)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多