为啥修饰符顺序在 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 中很重要? [复制]的主要内容,如果未能解决你的问题,请参考以下文章