SwiftUI修改Text属性报错及深浅主题样式切换实现方法
报错原因
- 你采用的链式调用后直接接三元表达式的写法,Swift无法推断不透明返回类型(
some View)的上下文主体,且三元运算符要求左右两边返回的类型必须完全一致,两个不同的some View扩展方法返回值不满足该要求 - 额外注意:你代码中调用的方法名
applyLabelStyle()和你实际定义的扩展方法名applyHeadingStyle()不一致,笔误也会引发报错
最优解决方案(推荐)
直接定义自动适配明暗模式的颜色,不需要手动判断colorScheme,系统会自动切换样式:
- 先定义适配主题的动态颜色
extension UIColor { static let dynamicLabelColor: UIColor = UIColor { traitCollection in traitCollection.userInterfaceStyle == .light ? .colorGrayDark1 : .white } }
- 合并你的Text扩展为一个方法即可
extension Text { func applyHeadingStyle() -> some View { self.foregroundColor(Color(UIColor.dynamicLabelColor)) .font(.system(size: 16)) } }
- 调用代码简化为
Text("Destinatar") .applyHeadingStyle()
其他可选方案
如果你需要保留两套独立的样式方法,有两种实现方式:
方案1:使用条件分支渲染
@Environment(\.colorScheme) var colorScheme // 视图body内写法 if colorScheme == .light { Text("Destinatar") .applyHeadingStyle() } else { Text("Destinatar") .applyHeadingStyleDark() }
方案2:类型抹除后使用三元运算符
修改扩展方法返回值为AnyView,让三元运算符两边类型一致:
extension Text { func applyHeadingStyle() -> AnyView { AnyView( self.foregroundColor(Color(UIColor.colorGrayDark1)) .font(.system(size: 16)) ) } func applyHeadingStyleDark() -> AnyView { AnyView( self.foregroundColor(.white) .font(.system(size: 16)) ) } }
调用写法:
let text = Text("Destinatar") colorScheme == .light ? text.applyHeadingStyle() : text.applyHeadingStyleDark()
内容的提问来源于stack exchange,提问作者Exal
相关产品推荐
相关产品推荐

