macOS 10.12调用toggleAutomaticTextCompletion报错的兼容方案
macOS 10.12 兼容场景下无@available标注的版本报错解决
报错核心原因
toggleAutomaticTextCompletion(_:)是macOS 10.12.2才对外暴露的NSTextView方法,直接通过#selector(NSTextView.toggleAutomaticTextCompletion(_:))显式引用该方法时,编译器会强制触发API可用性校验,在部署目标设为macOS 10.12时就会抛出版本不兼容报错。
替代实现方案
不需要加任何@available版本标注,直接通过字符串构造Selector绕开编译期的API可用性检查即可,替换原有代码段为如下写法:
case .textCompletion: return ( Selector("toggleAutomaticTextCompletion:"), .none )
实现说明
- 该写法编译期不会校验对应API的存在性和版本要求,部署目标设置为macOS 10.12时可直接编译通过,完全符合不使用
@available标注的要求。 - Selector构造的方法签名和原
#selector获取的方法完全一致,在macOS 10.12.2及以上系统中,调用效果和原写法无任何差异。 - 低版本兼容处理:实际触发该方法调用前,增加
responds(to:)判断即可避免低版本系统崩溃,示例判断逻辑:
if textView.responds(to: Selector("toggleAutomaticTextCompletion:")) { textView.perform(Selector("toggleAutomaticTextCompletion:"), with: nil) }
- 该方案依赖AppKit的Objective-C动态派发特性,方法命名是苹果系统公开稳定的API,不存在私有API调用风险。
内容的提问来源于stack exchange,提问作者Jeremy Seigle
相关产品推荐
相关产品推荐

