【问题标题】:SwiftUI - View with conditionSwiftUI - 有条件查看
【发布时间】:2021-06-06 06:58:05
【问题描述】:

我正在开发 iOS 应用程序。 我很好奇 if {} else {} 条件如何与 SwiftUI 视图一起使用。

import SwiftUI

struct SomeView: View {
   let condition: Bool

   var body: some View {
      if condition {
         ...
      } else {
         ...
      }
   }

}

我想知道否定条件下的代码是否甚至被if条件生成但禁用?如果是这样,是否可以构建只生成满足特定条件的代码的视图?用 Lambda 的?

我是 Swift 新手,任何示例都会有所帮助 谢谢!

【问题讨论】:

  • 我想说,既然是闭包,那么整个代码都被编译了,但是在运行时,当调用闭包构建视图时,只执行if的相关分支(取决于condition)。
  • @D.Mika 上面的代码不包含闭包或任何将被编译为闭包的东西。
  • @idmean View 后面的部分是闭包。
  • @D.Mika 不,这是一个计算属性而不是闭包。见the body property in View。闭包是可以传递的值。函数计算 body 无法获取和传递,所以它不是闭包。
  • @idmean:你是对的。我的错。

标签: ios swift iphone


【解决方案1】:

SwiftUI 使用result builder。结果构建器允许您使用一组函数转换每个表达式语句,即它们允许您将所有表达式语句减少为一个值,然后是函数的结果。

但是,这并没有改变 if-else 的语义,除了将转换后的结果结转并将它们合并为一个值所必需的逻辑。你可以阅读更多关于这个here的信息。

所以,不,如果条件评估为真,则 if 块将被执行,如果条件评估为假,则执行 else 块。

【讨论】:

  • 好的,我明白了。所以即使是clousures也无济于事?我想知道我是否应该担心内部某个地方正在“工作”但隐藏了部分代码。由于性能等明显原因,我想跳过它。
  • @MateuszKorga 以什么方式帮助?你想达到什么目标?
  • 我知道在这两种情况下都会生成结果,但是这个“html”上的一部分将被隐藏。是吗?还是只生成真条件?
  • 只执行if的一部分,返回生成的视图。没有什么隐藏的。
【解决方案2】:

虽然视图是有条件地显示的,但类型仍然是编码的。例如:

struct ContentView: View {
    var body: some View {
        Group {
            if true {
                Color.blue
            } else {
                Text("You'll never see me!")
            }
        }
    }
}

编码为Group<_ConditionalContent<Color, Text>>,即使Text 从未显示。

此类特定类型使 SwiftUI 更容易区分视图 - 请参阅 WWDC21 会议“揭秘 SwiftUI”以获得更完整的解释。

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多