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)
额外说明
- 原函数中的
assetName参数未被使用,建议删除或补充对应的逻辑(比如当系统图标不存在时,用assetName加载本地图片)。 - 运行时版本判断(
isOperatingSystemAtLeast)和编译期的#available略有区别:#available会在编译时移除不支持版本的代码,而运行时判断是在App运行时做分支选择,但对于当前场景来说,功能完全等价。
内容的提问来源于stack exchange,提问作者Raghavandra Santosh
相关产品推荐
相关产品推荐

