为何SwiftUI对View应用重复修饰符时仅第一个生效?
SwiftUI重复修饰符为何第一个生效?
我写了两段SwiftUI代码,结果和预期不符:
第一段代码:
Text("Hello, world!") .fontWeight(.heavy) // 此修饰符生效 .fontWeight(.thin) // 此修饰符不生效
按我对SwiftUI的理解,修饰符会生成新的View,类似纯函数逻辑,所以应该最后应用的.fontWeight(.thin)生效,但实际显示的是粗体文本,第一个修饰符起作用。
第二段代码:
Text("Hello, world!") .foregroundColor(.red) // 此修饰符生效 .foregroundColor(.yellow) // 此修饰符被忽略 .foregroundColor(.blue) // 此修饰符被忽略
文本最终显示为红色,后面的黄色、蓝色设置都没效果。
原因解析
这是因为像fontWeight、foregroundColor这类修饰符,本质是给Text的固有样式属性赋值,它们的设计逻辑是:仅当该属性尚未被明确设置时,才会生效。
以fontWeight为例:
- 初始的
Text使用系统默认字体,没有明确的权重值; - 第一个
.fontWeight(.heavy)给字体设置了明确的权重; - 后续的
.fontWeight(.thin)尝试修改权重,但此时字体已经有了明确的权重值,所以这个修饰符会被忽略,不会覆盖之前的设置。
同理,foregroundColor也是一样的逻辑——第一次设置后,文本的前景色已经被明确指定,后续同类型修饰符无法覆盖这个值。
如果想要覆盖之前的设置,你需要通过重新指定完整样式的方式实现,比如:
Text("Hello, world!") .fontWeight(.heavy) .font(.system(size: 16, weight: .thin)) // 完整指定字体,覆盖权重
内容的提问来源于stack exchange,提问作者SH KIM
相关产品推荐
相关产品推荐

