I'm learning result builder. This part of the doc
confuses me:
--- Quote Start ---
- A branch statement becomes a series of nested calls to the
buildEither(first:)
andbuildEither(second:)
methods. The statements’ conditions and cases are mapped onto the leaf nodes of a binary tree, and the statement becomes a nested call to thebuildEither
methods following the path to that leaf node from the root node.For example, if you write a switch statement that has three cases, the compiler uses a binary tree with three leaf nodes. Likewise, because the path from the root node to the second case is “second child” and then “first child”, that case becomes a nested call likebuildEither(first: buildEither(second: ... ))
. The following declarations are equivalent:
let someNumber = 19
@ArrayBuilder var builderConditional: [Int] {
if someNumber < 12 {
31
} else if someNumber == 19 {
32
} else {
33
}
}
var manualConditional: [Int]
if someNumber < 12 {
let partialResult = ArrayBuilder.buildExpression(31)
let outerPartialResult = ArrayBuilder.buildEither(first: partialResult)
manualConditional = ArrayBuilder.buildEither(first: outerPartialResult)
} else if someNumber == 19 {
let partialResult = ArrayBuilder.buildExpression(32)
let outerPartialResult = ArrayBuilder.buildEither(second: partialResult)
manualConditional = ArrayBuilder.buildEither(first: outerPartialResult)
} else {
let partialResult = ArrayBuilder.buildExpression(33)
manualConditional = ArrayBuilder.buildEither(second: partialResult)
}
--- Quote End ---
I thought
if someNumber < 12 {
31
} else if someNumber == 19 {
32
} else {
33
}
is interpreted as
if someNumber < 12 {
31
} else {
if someNumber == 19 {
32
} else {
33
}
}
and it should be
var manualConditional: [Int]
if someNumber < 12 {
let partialResult = ArrayBuilder.buildExpression(31)
let manualConditional = ArrayBuilder.buildEither(first: partialResult)
} else if someNumber == 19 {
let partialResult = ArrayBuilder.buildExpression(32)
let outerPartialResult = ArrayBuilder.buildEither(first: partialResult)
manualConditional = ArrayBuilder.buildEither(second: outerPartialResult)
} else {
let partialResult = ArrayBuilder.buildExpression(33)
let outerPartialResult = ArrayBuilder.buildEither(second: partialResult)
manualConditional = ArrayBuilder.buildEither(second: outerPartialResult)
}
but it seems it is interpreted as
if what-goes-here {
if someNumber < 12 {
31
} else if someNumber == 19 {
32
}
} else {
33
}
which doesn't seem right to me.