如何在@available(iOS 15.0, *)声明中为存储属性添加低版本兼容实现?
解决方案
你可以通过计算属性封装内部版本分支的方式实现需求,规避属性声明层不支持if @available的限制,同时保持外部调用接口不变,完整实现代码如下:
class SelectableButtonItem: UIBarButtonItem { // 供iOS 14及更低版本使用的私有存储属性 private var _legacyIsSelected: Bool = false // 全版本通用的对外访问属性 var isSelected: Bool { get { if #available(iOS 15.0, *) { return super.isSelected } else { return _legacyIsSelected } } set { if #available(iOS 15.0, *) { super.isSelected = newValue } else { _legacyIsSelected = newValue } // 原didSet中的自定义逻辑统一放在此处执行,全版本生效 // ... some custom action } } }
实现说明
- 低版本的存储属性标记为私有,避免外部误访问
- 版本判断逻辑放在计算属性的
get/set内部,语法完全合法 - 自定义逻辑统一维护,不需要分别写高低版本两套实现
- 外部调用方式和原有逻辑完全一致,不需要修改业务层代码
内容的提问来源于stack exchange,提问作者Denis Bystruev
相关产品推荐
相关产品推荐

