Я натолкнулся на функцию массива 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
внутри моего замыкания, чтобы получить результат факториала.