gpt4 book ai didi

swift - 在函数内创建闭包时出错

转载 作者:行者123 更新时间:2023-11-28 14:39:59 25 4
gpt4 key购买 nike

非常感谢您的回复。确实,我在这个阶段正在学习编写闭包。实际上,我在某处读到有关“forEach”函数的信息,该函数适用于集合并且采用单个参数作为参数(即闭包)。

forEach 的语法是“Void forEach(body: (Int) throws -> Void) rethrows”

我想做的是编写一个带有单个参数(即闭包)的类似函数,该函数将计算数字的阶乘,因此我们可以打印该数字的阶乘。我不想将该数字作为第二个参数传递给该函数。

我知道 forEach 是 Collections 类的一个成员函数,它一个一个地作用于每个元素。所以它从数组中获取元素。同样,我在我的类中创建了一个私有(private)属性 (factorialNumber)(我可以使用公共(public)函数“setFactorialNumber”设置其值)。现在我正在尝试为我的类创建一个公共(public)函数(阶乘),它只有一个参数(即闭包),它将在内部使用“factorialNumber”属性的值并计算我们可以从外部打印的那个数字的阶乘当我们从其他代码调用该函数时。

下面是我的课..

public class MyArray {
private var factorialNumber = 0

public func setFactorialNumber(factorialNumber value: Int) {
factorialNumber = value
}

public func factorial(body closure: (Int) -> Void) -> Void {
var outputString: String?
var result = 1

if factorialNumber <= 0 {
outputString = nil
} else {
outputString = ""
while(factorialNumber >= 1) {
if factorialNumber == 1 {
outputString = outputString! + "\(factorialNumber) = \(result)"
break
} else {
outputString = outputString! + "\(factorialNumber) x "
}
result = result * factorialNumber
factorialNumber -= 1
}
}
}
}

最佳答案

闭包基本上是一个想要被调用的函数。
在您的情况下,您正在定义它但没有使用它。

我在 factorial(body:) 中看到的问题:

  1. 你应该至少执行一次闭包。
    即在某些时候执行以下操作:

    closure(someValue)
  2. 您似乎维护了一个outputString,它看起来像是您希望闭包采用的东西。
    在这种情况下,您的闭包应该采用 String 而不是 Int

    func factorial(body closure: (String?) -> Void) -> Void { //...

最后,函数应该是这样的:

func factorial(body closure: (String?) -> Void) -> Void {
var outputString: String?

//...your factorial logic as:
if factorialNumber <= 0 {
outputString = nil
} else {
outputString = ""
while(factorialNumber >= 1) {
if factorialNumber == 1 {
outputString = outputString! + "\(factorialNumber) = \(result)"
break
} else {
outputString = outputString! + "\(factorialNumber) x "
}
result = result * factorialNumber
factorialNumber -= 1
}
}

//Finally, the closure call
closure(outputString)
}

看看你的结构,它的用法是:

let factorial = MyArray()
factorial.setFactorialNumber(factorialNumber: 20)
factorial.factorial { (result) in
print(result)
}

它的输出是:

20 x 19 x 18 x 17 x 16 x 15 x 14 x 13 x 12 x 11 x 10 x 9 x 8 x 7 x 6 x 5 x 4 x 3 x 2 x 1 = 2432902008176640000


注意:你的类是 Crashable

以上答案足以满足您问题的特定背景,但请注意:

  1. 您的逻辑使用 Int,因此大于 20 的数字会导致您的代码崩溃

    解决方案:

    • 使用
    • 防止您的逻辑因输入太大而无法处理而崩溃
  2. 如果您不setFactorialNumber(factorialNumber:),而是直接跳转到调用factorial(body:),您的代码将会崩溃。


改进?:

  • 将类名从 MyArray 更改为 FactorialFinder 或其他名称
  • 给这个类添加一个init:

    init(with number: Int) {
    self.factorialNumber = number
    }
  • 现在我们有一个自定义的 init,将默认的 init 设为私有(private):

    private init() {}
    • 所以这样的事情是不可能的 FactorialFinder()
    • 并且FactorialFinder(with:)成为初始化这个类的唯一方式

关于swift - 在函数内创建闭包时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com