You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:40:41