DevPrep

Все темы › Современный Swift

Что такое result builder?

Middle PRO

Суть

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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store