You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:09:00