Обещательный метод - PullRequest
0 голосов
/ 06 июня 2019

Чтобы объяснить мой вопрос более просто, я приведу пример простого вывода на консоль.

У меня есть простой функционал, который принимает строку и выводит ее на консоль:

func printer(text: String) {
    print(text)
}

Иногда мне нужно напечатать текст с какой-нибудь дополнительной строкой

func printer(text: String, _ additionalString: String) {
    print(text + additionalString)
}

Как мне добиться этого синтаксиса со стороны вызывающей стороны:

printer(text: "Event").withParam("Tap")

Вывод на консоль: EventTap

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Ваш точный синтаксис не может быть достигнут, потому что методы не знают, когда вы закончите цепочку вызовов.Например, когда возвращается printer, он не знает и не может знать, собираетесь ли вы вызывать withParam или нет, поэтому он не может решить, вызывать ли метод с полученным аргументом (аргументами).или дождаться новых аргументов.

Поэтому вам нужно завершить цепочку вызовов другим методом:

printer(text: "Event").withParam("Tap").print()

Теперь это очень похоже на шаблон компоновщика.printer может быть классом с именем Printer, реализованным так:

class Printer {
    private var text: String
    private var param: String?

    init(text: String, _ param: String? = nil) {
        self.text = text
        self.param = param
    }

    func withParam(_ param: String) -> Printer {
        self.param = param
        return self
    }

    func print() {
        if let arg = self.param {
            // I understand that you are referring two two general methods here, not limited to print
            Swift.print(text + arg) // or call the method with two parameters
        } else {
            Swift.print(text) // or call the method with one parameter
        }
    }
}

И вы можете сделать:

Printer(text: "Event").withParam("Tap").print()
// or just
Printer(text: "Event").print()
// or
Printer(text: "Event", "Tap").print()
0 голосов
/ 06 июня 2019

Чтобы предоставить простую альтернативу - вы можете просто использовать поведение по умолчанию функции печати в качестве функции с переменными значениями:

print("Event", "Tap")

Или определить свой собственный метод с использованием переменных с помощью приведенного выше, если вам необходимо:

func printer(_ strings: String...) {
    // 'strings' is an array - pass in as many as you like.
    print(strings.joined())
}

Затем вызовите

// Prints "EventTapEtc"
printer("Event", "Tap", "Etc")

РЕДАКТИРОВАТЬ: Хорошо, похоже, вы хотите точный формат, как указано выше.В этом случае это лучшее, что я мог придумать.Сначала определите класс, который будет функционировать как ваше обещание:

class Printer {

    var string: String

    init(_ string: String) {
        self.string = string
    }

    func addParam(_ string: String) -> Printer {
        self.string += string
        return self
    }

    func print() {
        Swift.print(string)
    }

}

Затем определите функцию вашего принтера:

func printer(_ string: String) -> (Printer) {
    return printer(string)
}

И вы можете вызвать с помощью:

printer("hello").addParam("goodbye").print()

ВТОРОЕ РЕДАКТИРОВАНИЕ: Похоже, что ответ выше меня опередил!Я бы пошел с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...