В качестве дополнения к ответу Криса:
Давайте немного посмотрим на замыкания. «Нормальное» замыкание, которое мы можем видеть, например, с .map { ... }
с массивами, которое применяет функцию к каждому элементу списка и возвращает новый список с результатами, например:
let myArray = [1, 2, 3, 4, 5]
tenTimes = myArray.map { (element) -> (Int) in
return element * 10
}
// tenTimes is [10, 20, 30, 40, 50]
(element) -> (Int) in
означает: мы получаем параметр и называем его element
, чтобы мы могли использовать его внутри замыкания, а тип возвращаемого значения замыкания - Int
.
Часто мы используем сокращенную версию для второй строки этого небольшого фрагмента кода:
myArray.forEach { element in
В этом случае Swift может определить тип возвращаемого значения.
Но поскольку (я полагаю) Swift 5.1, есть новое правило: , когда содержимое функции / переменной / замыкания составляет только одну строку кода, нам не нужно явно писать слово return
. Так что в приведенном выше случае мы могли бы также сказать:
tenTimes = myArray.map { element in
element * 10
}
SwiftUI часто использует это. Но есть еще кое-что: замыкания в SwiftUI - это специальные замыкания @ViewBuilder. следовательно, вы можете поместить несколько представлений в другое представление, как если бы у вас была функция с несколькими return
s. Но когда вы используете другой код, такой как оператор let
, все портится. SwiftUI не понимает, что вы хотите.
Иногда вы можете немного помочь, используя явный return
, но часто ошибка просто перемещается в другое место. Есть шанс, что после многих недоразумений, вы получите его, но я могу заверить вас, что это не будет красивый код. Поэтому я бы выбрал решение Криса.
Если вы хотите узнать больше о замыканиях, вот ссылка на официальную документацию: https://docs.swift.org/swift-book/LanguageGuide/Closures.html. Очень интересно, но много информации!