为什么在SwiftUI中修饰符顺序很重要?

时间:2020-06-01 20:33:12

标签: swiftui

在SwiftUI中将修饰符应用于视图时,顺序似乎很重要。

例如,此代码:

HStack {
  Text("Hello world")
    .padding()
    .background(Color(UIColor.darkGray))
    .cornerRadius(20.0)
}

..将产生以下内容:

watchOS preview displaying a simple view

更改修饰符的顺序,事情会发生变化。这段代码有效地“破坏”了修饰符,因为不再应用填充和拐角半径:

HStack {
  Text("Hello world")
    .background(Color(UIColor.darkGray))
    .padding()
    .cornerRadius(20.0)
}

watchOS preview displaying a simple view where the view modifiers aren't applied

这是为什么?我敢肯定有一个合理的解释,但我找不到任何文档或理由。

2 个答案:

答案 0 :(得分:2)

修饰符是通过包装其修改的视图返回some View的函数。例如,.padding返回some View,它实现了填充功能,其内容是它修改的视图以及填充:

所以,从概念上讲:

HStack {
  Text("Hello world")
    .padding()
    .background(Color(UIColor.darkGray))
    .cornerRadius(20.0)
}

大致等同于(组成名称和参数):

HStack(content: {
   CornerRadiusView(20.0, content: {
      BackgroundView(Color(UIColor.darkGray), content: {
         PaddingView(content: { 
            Text("Hello world") 
         })
      })
   })
})

希望,从示例中可以清楚看到修饰符的顺序如何改变视图层次结构。

答案 1 :(得分:0)

新开发者的答案是正确的。 Here也是另一个很好的解释,说明幕后发生了什么。这只是同一概念的另一种观点:

每当我们对SwiftUI视图应用修饰符时,我们实际上都会创建一个 应用了更改的新视图–我们不只是修改现有视图 查看到位。如果您考虑一下,这种行为是有道理的-我们的 视图仅包含我们赋予它们的确切属性,因此如果我们设置 背景颜色或字体大小,没有地方可以存储该数据。