Такой синтаксис требует пользовательского result builder и инициализатора Array. Обычный Array сам по себе не собирает выражения и if из замыкания.
Array {
Такой синтаксис требует пользовательского result builder и инициализатора Array. Обычный Array сам по себе не собирает выражения и if из замыкания.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Array { value1 value2
if condition { value3 } }
Ответ
Такой синтаксис требует пользовательского result builder и инициализатора Array. Обычный Array сам по себе не собирает выражения и if из замыкания.
Минимальный DSL:
@resultBuilder
enum ArrayBuilder<Element> {
static func buildExpression(_ value: Element) -> [Element] { [value] }
static func buildBlock(_ parts: [Element]...) -> [Element] {
parts.flatMap { $0 }
}
static func buildOptional(_ part: [Element]?) -> [Element] { part ?? [] }
}
extension Array {
init(@ArrayBuilder<Element> _ build: () -> [Element]) {
self = build()
}
}
let condition = true
let values: [Int] = Array {
1
2
if condition { 3 }
}
Результат [1, 2, 3], при false — [1, 2]. buildOptional поддерживает if без else; для if/else нужны buildEither, для циклов — buildArray. Это собственное расширение, не встроенная возможность любого замыкания.
Источник: raw.githubusercontent.com.