我问这个问题是因为我今天突然意识到,由于我们在SwiftUI中用于构建View的if/else语句是由ViewBuilder解释的,因此它的行为可能与Swift语言中普通的if/else语句不同。可能是因为某些原因(例如性能),SwiftUI预执行这两个子句并缓存结果吗?有人确切地知道吗?我记得我在过去观察到一些令人困惑的行为,这可能可以用这个假设来解释,但不幸的是我想不起一个例子。
if/else
ViewBuilder
e4eetjau1#
SE-0289: Result builders中详细说明了结果生成器转换代码的方式。"选择语句"一节介绍了if/else语句如何转换。它给出了以下示例:请看下面的代码:
if i == 0 { "0" } else if i == 1 { "1" } else { generateFibTree(i) }
在此模式下,示例代码如下所示:
let vMerged: PartialResult if i == 0 { var firstVar = "0" var firstBlock = BuilderType.buildBlock(firstVar) vMerged = BuilderType.buildEither(first: firstBlock) } else if i == 1 { var secondVar = "1" var secondBlock = BuilderType.buildBlock(secondVar) vMerged = BuilderType.buildEither(second: BuilderType.buildEither(first: secondBlock)) } else { var elseVar = generateFibTree(i) var elseBlock = BuilderType.buildBlock(elseVar) vMerged = BuilderType.buildEither(second: BuilderType.buildEither(second: elseBlock)) }
您还可以阅读转换算法的详细描述,但我认为该示例已经足够清楚,它将只执行if/else语句的一个分支。
1条答案
按热度按时间e4eetjau1#
SE-0289: Result builders中详细说明了结果生成器转换代码的方式。"选择语句"一节介绍了
if/else
语句如何转换。它给出了以下示例:请看下面的代码:
在此模式下,示例代码如下所示:
您还可以阅读转换算法的详细描述,但我认为该示例已经足够清楚,它将只执行
if/else
语句的一个分支。