ios SwiftUI视图生成器:当condition为真时,是否可以保证in 'if/ese'语句中的'else'子句不被执行?

nsc4cvqm  于 2023-01-27  发布在  iOS
关注(0)|答案(1)|浏览(91)

我问这个问题是因为我今天突然意识到,由于我们在SwiftUI中用于构建View的if/else语句是由ViewBuilder解释的,因此它的行为可能与Swift语言中普通的if/else语句不同。可能是因为某些原因(例如性能),SwiftUI预执行这两个子句并缓存结果吗?有人确切地知道吗?
我记得我在过去观察到一些令人困惑的行为,这可能可以用这个假设来解释,但不幸的是我想不起一个例子。

e4eetjau

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语句的一个分支。

相关问题