Что такое result builder?
Суть
Result builder (@resultBuilder) — тип со статическими методами, по которым компилятор переписывает тело замыкания: каждая строка-выражение становится вызовом buildExpression, их список — buildBlock, if без else — buildOptional, if/else — buildEither(first:/second:), for — buildArray, if #available — buildLimitedAvailability. Так получается декларативный DSL с обычным Swift-кодом внутри. На этом построены @ViewBuilder, RegexBuilder, @CommandsBuilder.
@resultBuilder
enum ListBuilder {
static func buildExpression(_ s: String) -> [String] { [s] }
static func buildBlock(_ parts: [String]...) -> [String] {
parts.flatMap { $0 }
}
static func buildOptional(_ part: [String]?) -> [String] { part ?? [] }
static func buildEither(first: [String]) -> [String] { first }
static func buildEither(second: [String]) -> [String] { second }
static func buildArray(_ parts: [[String]]) -> [String] {
parts.flatMap { $0 }
}
}
func menu(@ListBuilder _ content: () -> [String]) -> [String] { content() }
let isAdmin = true
let items = menu {
"Home"
if isAdmin { "Admin" } // buildOptional
for i in 1...2 { "Item \(i)" } // buildArray
}
print(items) // ["Home", "Admin", "Item 1", "Item 2"]
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep