【发布时间】:2018-06-03 23:39:58
【问题描述】:
我遇到了数组forEach 函数,它是一个高阶函数,它只需要一个参数,即,一个闭包。现在这个闭包在内部循环遍历数组的所有元素,但不返回任何内容。闭包的实现留给用户选择。
我有一个自定义类 MyClass,其中有一个私有变量 num 和一个公共函数 setNum(num: Int) 从外部设置该私有变量的值。我只是想在我的自定义类中创建一个类似的函数factorial,它只接受一个参数,即,一个闭包。但是,我必须手动调用factorial 内部的闭包,将num 的值作为参数传递给闭包。
有没有一种方法可以使闭包对num 起作用而无需将其作为参数传递?基本上我只是想复制数组forEach 函数。数组forEach的语法是:
array.forEach(body: (Int) -> Void) -> Void)
实施:
arr1.forEach { print($0) }
我的代码如下:
import Foundation
public class MyClass {
private var factorialNumber: Double = 0
internal static var instance: MyClass?
public func setFactorialNumber(number value: Double) {
factorialNumber = value
}
public func factorial(body closure: (String?) -> Void) -> Void {
var outputString: String?
var result: Double = 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
}
}
// Finally closure call
closure(outputString)
}
private init() {}
public static func getInstance() -> MyClass {
if self.instance == nil {
self.instance = MyClass()
}
return self.instance!
}
}
这就是我必须如何调用我的函数来计算阶乘:
var obj1 = MyClass.getInstance()
obj1.setFactorialNumber(number: 5)
obj1.factorial{ (result) in
print(result ?? "Factorial Result is Nil")
}
请注意,我必须在我的闭包中传递一个参数 result 才能得到阶乘的结果。
【问题讨论】:
-
使用闭包来计算阶乘是没有意义的。
Array的forEach函数与您对factorial的需求毫无共同之处。 -
你不想减少而不是 foreach 吗? developer.apple.com/documentation/swift/array/2298686-reduce
-
@vermau 您提到了
MyClass和MyArray,但看起来它们是一回事。看来MyClass是一个错字,应该是MyArray。然后MyArray是一个非常糟糕的类名称,因为该类与数组无关。 -
我不太清楚这个问题。你说“我要做的就是学习如何创建像 array.forEach 这样的高阶函数。”但你已经做到了。
factorial不是“像 array.forEach 这样的高阶函数”怎么样?你想要什么调用语法而不是你提供的调用语法? -
"... 在 array.forEach 函数中,没有传递给闭包的参数。" – 我不确定你的意思。
arr1.forEach { print($0) }是arr1.forEach { (elem) in print(elem) }的简写,elem是传递给闭包的参数。