mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
1.4 KiB
1.4 KiB
Swift、OC混编
apinotes 文件
经常在 Swift、OC 混编的时候,系统会给方法命名等做一些优化,比如 OC 侧的枚举,在 Swift 就是结构体。为了代码规范或者某些因素考量,我们需要做一些约定,不让编译器自动处理,比如一些常见的宏:
NS_SWIFT_NAMENS_TYPED_EXTENSIABLE_ENUMNS_REFINED_FOR_SWIFT
宏来配置存在弊端,手动去处理一个工程、一个 SDK 的话,假设有10000个方法,工作量太大。
Xcode 推出解决方案:
- 创建
SDK名称.apinotes文件 - 放到 SDK 根目录下
- 按照 yaml 格式,编写内容
比如:
---
Name: PersonFramework
Classes:
- Name: WorkHard
# SwiftName: WorkHardAtSwift
Methods:
- Selector: "upgradeToLeader:"
Parameters:
- Position: 0
Nullability: O
MethodKind: Instance
SwiftPrivate: true
# Availability: nonswift // WorkHard 类的 upgradeToLeader 方法,在 Swift 侧不允许调用
#AvailabilityMsg: "prefer 'deinit'" // 如果调用,则提示对应的信息
- Selector: "initWithName:"
MethodKind: Instance
DesignatedInit: true
更多格式,请参考 clang::APINOTES
该方案是 Apple 标准做法,不是骚操作,Objc 源码中也有使用。如下所示