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

Swift中如何将#available作为函数参数传入?代码优化求助

优化方案:提取通用函数,动态传入最低iOS版本要求

当然可以优化,但要注意#available(iOS X, *)是编译期指令,无法直接将版本号作为参数传入(因为它在编译阶段就会处理代码分支)。不过我们可以通过运行时版本判断来实现类似的效果,把重复逻辑提取成通用函数,将最低iOS版本作为参数传入。

优化后的代码

方式1:直接传入版本信息

func setImage(_ name: String, button: UIButton, minimumiOSVersion: OperatingSystemVersion) {
    let shouldUseSystemImage = ProcessInfo.processInfo.isOperatingSystemAtLeast(minimumiOSVersion)
    
    // 简化图片赋值逻辑
    let buttonImage = shouldUseSystemImage 
        ? UIImage(systemName: name) ?? UIImage() 
        : UIImage(named: name) ?? UIImage()
    
    button.setImage(buttonImage, for: .normal)
}

调用示例:

// 对应原setImage函数(iOS13+用系统图标)
setImage("your-icon-name", button: yourButton, minimumiOSVersion: OperatingSystemVersion(majorVersion: 13, minorVersion: 0, patchVersion: 0))

// 对应原setFaxMachineImage函数(iOS14+用系统图标)
setImage("fax-machine-icon", button: faxButton, minimumiOSVersion: OperatingSystemVersion(majorVersion: 14, minorVersion: 0, patchVersion: 0))

方式2:用枚举简化版本参数(更易读)

如果觉得直接传OperatingSystemVersion不够直观,可以定义枚举封装常用版本:

enum MinimumiOSVersion {
    case v13, v14
    
    var osVersion: OperatingSystemVersion {
        switch self {
        case .v13:
            return OperatingSystemVersion(majorVersion: 13, minorVersion: 0, patchVersion: 0)
        case .v14:
            return OperatingSystemVersion(majorVersion: 14, minorVersion: 0, patchVersion: 0)
        }
    }
}

func setImage(_ name: String, button: UIButton, minimumVersion: MinimumiOSVersion) {
    let shouldUseSystemImage = ProcessInfo.processInfo.isOperatingSystemAtLeast(minimumVersion.osVersion)
    let buttonImage = shouldUseSystemImage 
        ? UIImage(systemName: name) ?? UIImage() 
        : UIImage(named: name) ?? UIImage()
    
    button.setImage(buttonImage, for: .normal)
}

调用示例:

setImage("your-icon-name", button: yourButton, minimumVersion: .v13)
setImage("fax-machine-icon", button: faxButton, minimumVersion: .v14)

额外说明

  1. 原函数中的assetName参数未被使用,建议删除或补充对应的逻辑(比如当系统图标不存在时,用assetName加载本地图片)。
  2. 运行时版本判断(isOperatingSystemAtLeast)和编译期的#available略有区别:#available会在编译时移除不支持版本的代码,而运行时判断是在App运行时做分支选择,但对于当前场景来说,功能完全等价。

内容的提问来源于stack exchange,提问作者Raghavandra Santosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:13:34