为啥修饰符顺序在 SwiftUI 中很重要? [复制]

Posted

技术标签:

【中文标题】为啥修饰符顺序在 SwiftUI 中很重要? [复制]【英文标题】:Why does modifier order matter in SwiftUI? [duplicate]为什么修饰符顺序在 SwiftUI 中很重要? [复制] 【发布时间】:2020-06-01 20:33:12 【问题描述】:

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

例如这段代码:

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

..会产生这个:

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

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

这是为什么?我确信有一个合乎逻辑的解释,但我找不到任何文档或理由。

【问题讨论】:

【参考方案1】:

修饰符是一个函数,它通过包装它修改的内容视图返回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") 
         )
      )
   )
)

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

【讨论】:

【参考方案2】:

New Dev 的回答是正确的。 Here 也是另一个很好的解释幕后发生的事情。这只是同一概念的另一种观点:

每当我们将修饰符应用到 SwiftUI 视图时,我们实际上会创建一个 应用了该更改的新视图——我们不只是修改现有的 查看到位。如果你仔细想想,这种行为是有道理的——我们的 视图只保存我们给它们的确切属性,所以如果我们设置 背景颜色或字体大小没有地方存储这些数据。

【讨论】:

以上是关于为啥修饰符顺序在 SwiftUI 中很重要? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥顺序在这个链式分配中很重要?

为啥媒体查询的顺序在 CSS 中很重要?

为啥媒体查询的顺序在 CSS 中很重要?

为啥替代品的顺序在正则表达式中很重要?

为啥 SOAP 参数的顺序在 PHP SOAP 中很重要,以及如何解决它?

为啥不透明度声明的顺序在这个两阶段淡入中很重要?