Swift中@available标记后内部函数调用报错的原因及解决方法
问题原因与@available正确用法
报错原因
你当前的写法@available(macOS, obsoleted: 12)存在参数理解偏差:
obsoleted: 12表示该API在macOS 12版本被废弃,且从macOS 13开始完全不可用。- 当项目部署目标设为macOS 13或更高时,编译器会判定这个扩展内的所有API都已失效,哪怕是扩展内部调用
myFunc1,也会触发“unavailable”报错。 - 单独标记每个函数无效的原因同理:只要部署目标包含13+,编译器就会认为这些函数在当前环境下不可用,内部调用自然不被允许。
正确实现方式
要让函数仅在macOS 12及以下可用、13及以上不可用,需要正确组合@available参数,并配合内部的版本检查:
方式一:直接指定不可用版本
@available(macOS, unavailable: 13) extension MyStruct { func myFunc1() -> String { ... } func myFunc2() { // 添加版本检查,告知编译器这段代码仅在允许的版本执行 if #available(macOS, obsoleted: 12) { let resultOfCallOfMyFunc1 = myFunc1() // 后续业务逻辑 } } }
unavailable: 13明确表示从macOS 13开始,该扩展内的API完全不可用,12及以下版本正常开放。内部调用时的#available判断是通过编译器校验的关键。
方式二:明确引入+废弃+不可用版本(若需追溯API起源)
如果需要指定API的首次引入版本(比如从macOS 10.15开始提供),可以补充introduced参数:
@available(macOS, introduced: 10.15, obsoleted: 12, unavailable: 13) extension MyStruct { func myFunc1() -> String { ... } func myFunc2() { if #available(macOS, obsoleted: 12) { let resultOfCallOfMyFunc1 = myFunc1() } } }
各参数作用:
introduced: 10.15:标记API首次在macOS 10.15引入obsoleted: 12:标记API在macOS 12被废弃(编译时会给出废弃警告)unavailable: 13:标记API从macOS 13开始彻底不可用
关键提醒
- 若项目部署目标包含macOS 13+,必须在内部调用时添加
#available条件判断,否则编译器会直接报错。 - 区分
obsoleted和unavailable:前者是“废弃(仍可使用但提示警告)”,后者是“彻底不可用(调用直接报错)”,你的需求必须用unavailable: 13来实现13及以上版本的禁用。
内容的提问来源于stack exchange,提问作者Jason Krowl
相关产品推荐
相关产品推荐

