Swift适配:不添加@available解决some返回类型低版本macOS报错
问题原因
编译报错的核心原因是some关键字声明的不透明返回类型是Swift 5.1的新增语法,对应最低系统要求为macOS 10.15.0,低版本系统无法兼容该语法。如果不想添加@available版本标注,只需要替换掉some的不透明类型声明即可,不需要修改其他业务逻辑。
可选择的重构方案
方案1:返回具体实现类型(推荐,无任何兼容问题)
你定义的none属性固定返回NoAction结构体实例,完全可以直接把返回类型声明为具体的NoAction类型,不需要做类型隐藏,修改后的代码如下:
public extension Action { static var none: NoAction { NoAction() } // ------------------------------------- /** other code below }
这种写法是Swift最基础的静态类型返回语法,兼容所有Swift版本,调用方拿到的实例也完全遵守Action协议,不影响现有功能逻辑。
方案2:返回协议类型
如果出于接口设计考虑,不想对外暴露none属性的具体实现类型,可以直接把返回类型声明为Action协议类型,去掉some关键字即可:
public extension Action { static var none: Action { NoAction() } // ------------------------------------- /** other code below }
注意:如果你的Action协议定义了关联类型或者Self约束,这种协议类型作为返回值的写法会触发编译错误,这种情况直接使用方案1即可。
补充说明
some不透明类型的核心作用是对外隐藏具体返回类型的同时,保留类型的具体身份,规避协议类型的性能开销、绕开带关联类型协议的使用限制。你当前的场景是返回固定的无操作实现,完全不需要用到这个高版本特性,上述两种改法都可以彻底移除对macOS 10.15+的版本依赖,不需要添加任何版本标注。
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

