SwiftUI如何根据布尔值为Text条件添加修饰器避免代码重复
解决方案
方案1:自定义条件修饰符(最通用,贴合你理想的写法)
直接给View加扩展,支持条件应用修饰符:
extension View { @ViewBuilder func `if`<Content: View>(_ condition: Bool, transform: (Self) -> Content) -> some View { if condition { transform(self) } else { self } } }
使用方式和你预期的写法几乎一致,无冗余重复代码:
let isBold = true // 你的布尔判断条件 Text(text) .if(isBold) { $0.bold() } .foregroundColor(.black) .frame(alignment: .leading)
方案2:直接传布尔值到内置修饰符(无需自定义扩展)
大部分SwiftUI内置修饰符本身支持传入激活状态参数,无需额外封装:
Text(text) .bold(isBold) // 直接传入布尔值,true时生效,false时不生效 .foregroundColor(.black) .frame(alignment: .leading)
方案3:修正提前声明变量的写法
你之前声明变量报错的原因是:直接用let声明带修饰符的视图时,编译器会推断出具体的修饰后类型,后续追加修饰符会触发some View类型不匹配问题。改用@ViewBuilder包装计算属性即可解决:
@ViewBuilder var title: some View { Text("text") .foregroundColor(.black) } // 调用处直接追加修饰符即可 var body: some View { if isBold { title .bold() } else { title } }
内容的提问来源于stack exchange,提问作者TTJi
相关产品推荐
相关产品推荐

