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

如何通过弃用警告限制代码仅对Objective-C或Swift调用者开放?

限制Objective-C协议调用者语言并平稳迁移的方案

这是个很典型的跨语言代码迁移场景,我刚好有过类似的过渡实践,给你分享几个可行的方案:

一、限制Swift调用原Objective-C协议(引导用新Swift协议)

如果你希望Objective-C代码暂时继续使用原有协议,而Swift代码必须切换到新的Swift专属协议,可以直接在Objective-C协议上添加NS_SWIFT_UNAVAILABLE宏,给Swift开发者明确的迁移提示:

// 原Objective-C协议,标记为Swift不可用
@protocol OldLegacyProtocol <NSObject> NS_SWIFT_UNAVAILABLE("请使用新的SwiftProtocol替代此协议")
- (void)coreBusinessMethod;
- (void)auxiliaryMethod;
@end

然后在Swift中定义完全对齐的新协议:

// Swift专属协议,与原OC协议方法完全匹配
protocol SwiftProtocol {
    func coreBusinessMethod()
    func auxiliaryMethod()
}

这样Swift代码里一旦尝试使用OldLegacyProtocol,就会立刻收到编译警告/错误,强制开发者切换到新的Swift协议,而Objective-C代码不受任何影响,依然可以正常使用原协议。

二、更严格的方法级限制(可选)

如果想进一步限制Swift无法访问原OC协议的具体方法,可以给每个协议方法单独添加NS_SWIFT_UNAVAILABLE:

@protocol OldLegacyProtocol <NSObject>
- (void)coreBusinessMethod NS_SWIFT_UNAVAILABLE("请调用SwiftProtocol的coreBusinessMethod()");
- (void)auxiliaryMethod NS_SWIFT_UNAVAILABLE("请调用SwiftProtocol的auxiliaryMethod()");
@end

这种方式会让Swift中完全看不到原协议的方法,彻底切断Swift对原协议的使用路径。

三、迁移阶段的分步执行计划

按照你的规划,推荐这样分步推进:

  • 第一步:标记警告+新增Swift协议
    给原OC协议加上NS_SWIFT_UNAVAILABLE提示,同时完成Swift协议的定义,确保方法完全对齐。此时OC代码无影响,Swift代码会收到迁移警告。
  • 第二步:逐步替换Swift调用者
    逐个修改Swift代码中使用原OC协议的地方,替换为新的SwiftProtocol。期间可以通过编译检查确保所有Swift调用都完成切换。
  • 第三步:淘汰Objective-C协议
    等所有Swift代码迁移完成后,给原OC协议加上DEPRECATED_ATTRIBUTE("协议已废弃,请迁移至SwiftProtocol(OC可通过Swift bridging header访问)"),提示Objective-C开发者开始迁移。待OC代码也全部切换后,即可安全移除原Objective-C协议。

补充说明

如果你的需求是反过来(限制Objective-C调用,只允许Swift使用),可以给原OC协议添加NS_REFINED_FOR_SWIFT,同时在Swift中扩展协议做封装,但这种场景在你的迁移计划里用不上,就不多展开了。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:18:13