Как создать функции более высокого порядка в Swift? - PullRequest
0 голосов
/ 04 июня 2018

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

1 Ответ

0 голосов
/ 04 июня 2018

Есть ли способ, которым замыкание может воздействовать на число, не передавая его в качестве параметра?По сути, я просто пытаюсь повторить функцию массива forEach ... [И в вашем комментарии:] Все, что я пытаюсь сделать, - это научиться создавать функции более высокого порядка, такие как array.forEach.

Трудно понять, что, по вашему мнению, вы ищете, но, поверьте на слово, давайте напишем forEach.Вот и мы:

extension Sequence {
    func myForEach(f: (Element) -> ()) {
        for e in self {
            f(e)
        }
    }
}

Давайте проверим это:

[1,2,3].myForEach { print($0) } // prints 1, then 2, then 3

Мы сделали это!Мы написали функцию высшего порядка, которая действует точно так же, как forEach.Так что это должно быть так, как на самом деле работает forEach, более или менее.

Из примера видно, что бессмысленно просить не передавать параметр в функцию, которую принимает forEachв качестве параметра.Это именно то, что мы должны быть в состоянии сделать, чтобы эта функция имела элемент для работы.

...