SwiftUI针对特定macOS版本条件应用修饰符如何避免代码重复
SwiftUI 链式系统版本判断修饰符实现
完全可以实现无需重复公共代码、仅对单个修饰符做版本判断的链式调用写法,通过自定义SwiftUI的View扩展即可实现。
1. 实现通用条件修饰符扩展
添加如下View扩展代码:
import SwiftUI extension View { /// 满足条件时应用传入的修饰符 @ViewBuilder func `if`<Transform: View>(_ condition: Bool, transform: (Self) -> Transform) -> some View { if condition { transform(self) } else { self } } }
2. 调用示例
直接在链式调用中传入系统版本判断即可,和你期望的语法完全一致:
Button("test", action: {}) //.modifier1 //.modifier2 // 剩余所有公共修饰符 .if(#available(macOS 11.0, *)) { $0.foreground(.red) }
3. 可选:封装专属系统版本判断方法
如果不想每次调用都写#available判断,可以单独封装针对对应系统版本的修饰符:
extension View { /// macOS 11.0及以上版本应用传入修饰符 @ViewBuilder func macOS11Plus<Transform: View>(transform: (Self) -> Transform) -> some View { if #available(macOS 11.0, *) { transform(self) } else { self } } }
调用代码更简洁:
Button("test", action: {}) // 公共修饰符 .macOS11Plus { $0.foreground(.red) }
注意事项
- 上述实现基于
@ViewBuilder,属于编译期确定视图结构,不会带来运行时性能损耗 - 如果需要处理不满足条件的分支,扩展对应带else参数的重载方法即可
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

