Я думаю, вы немного запутались. Здесь есть несколько концепций, и создатели функций не играют так хорошо, как вы думаете об этом.
Когда код помещается между двумя скобками, мы называем его блоком * 1004. * кода. Это хороший способ помочь в организации наших программ, потому что мы можем разместить связанные части последовательной логики c вместе. Наиболее распространенное место для появления блока кода - функция. Например, у меня есть функция, которая вычисляет зарплату пользователя:
func calculateSalary() {
let monthly = 3500
let yearlyTotal = monthly * 12
print("Your salary is \(yearlyTotal)")
}
Тогда мы можем вызвать функцию, например, так:
calculateSalary()
Но мы можем также назначьте эту функцию переменной, где мы называем это замыканием . (Функции и замыкания на самом деле одно и то же, функции - это просто названные замыкания, которые мы можем легко повторно использовать и вызывать).
let calculateSalary: () -> Void = {
let monthly = 3500
let yearlyTotal = monthly * 12
print("Your salary is \(yearlyTotal)")
}
Как и следовало ожидать, мы можем вызывать функцию точно таким же образом.
Это означает, что мы можем передавать замыкания в качестве параметров методам или инициализаторам, чтобы другая функция или инициализатор могли вызывать нашу функцию, которую мы передаем. Например:
/**
* this is a stupid, pointless class (but it demonstrates
* closures-as-parameters nicely)
*/
class SalaryCalculator {
let closure: () -> Void
init(closure: () -> Void) {
self.closure = closure
}
}
let calculator = SalaryCalculator(closure: {
let monthly = 3500
let yearlyTotal = monthly * 12
print("Your salary is \(yearlyTotal)")
})
// call the closure!
calculator.closure()
Это также может быть написано с использованием синтаксиса trailing closure , где мы можем удалить метку аргумента, если замыкание является последним параметром для нашего инициализатора (или функции):
let calculator = SalaryCalculator {
let monthly = 3500
let yearlyTotal = monthly * 12
print("Your salary is \(yearlyTotal)")
}
// call the closure!
calculator.closure()
Это то, что вы видите, когда код, кажется, заключен в фигурные скобки ( factorize не является термином, который используется для описания этого). На самом деле это параметр замыкания, передаваемый инициализатору базового типа.
Разработчики функций в SwiftUI используют этот же принцип, но он немного более тонкий и сложный, чем мне хотелось бы сейчас разобраться.
Итак, , чтобы ответить на ваш вопрос более прямо - если вы хотите разбить ваш код на более управляемые части, я бы создал class
или struct
, который инкапсулирует некоторые logi c, затем разбейте последовательно связанные вызовы на функции в этом новом class
или struct
. Я не уверен, почему вы хотели бы выполнять задания так, как показано в вашем вопросе, в действительности это не имеет смысла, особенно с инициализаторами Swift, обеспечивающими так много настраиваемости в любом случае.