将相同的样式修饰符应用于条件 if/else 语句的任一分支

Applying identical styling modifiers to either branch of a conditional if/else statement

我有一个简单的视图,它要么是一个字符串,要么是带有上标的相同字符串,类似于下面的内容确实有效:

struct MyView : View {
  let both: Bool

  var body: some View {
    if both {
      Text("a") + Text("b").baselineOffset(6)
    } else {
      Text("a")
    }
  }
}

当我尝试对结果应用一些复杂的样式时,我 运行 遇到了麻烦,例如 .bold().font(.largeTitle).background(.yellow)...。无论采用哪个分支,我都想应用样式,但我能想到的最好的方法要求我为条件的每个分支重复它:

struct MyView : View {
  let both: Bool

  var body: some View {
    if both {
      (Text("a") + Text("b").baselineOffset(6)).bold().font(.largeTitle)....
    } else {
      (Text("a")).bold().font(.largeTitle)....
    }
  }
}

我想我有点理解为什么需要浏览结果生成器和视图生成器。构造此结构的规范方法是什么,以便我只有一个修饰符实例,而不必重新键入并在两个或多个位置保持同步?

您可以使用辅助变量(可计算或函数)来准备组合文本(`因为您想应用 text-specific 修饰符)并将所有文本修饰符应用于结果,例如

struct MyView : View {
    let both: Bool

    var body: some View {
        myText.bold().font(.largeTitle)
    }

    var myText: Text {
        if both {
            return Text("a") + Text("b").baselineOffset(6)
        } else {
            return Text("a")
        }
    }
}

在要更改的视图周围使用 Group { }。它是一种“不可见”的视图,将修饰符应用于其中的所有内容。

编辑:它不适用于 .baselineOffset(),不过(感谢@Asperi)。

试试这个:

            Group {
                if someState {
                    Text("Hello")
                } else {
                    Text("World")
                }
            }
            .font(.largeTitle)
            .foregroundColor(.red)
            .padding()

.font().foregroundColor().padding() 将应用于任一文本。