mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-25 04:17:17 +00:00
feature: dyld && LD 链接器
This commit is contained in:
@@ -1,10 +1,49 @@
|
||||
# Swift、OC混编
|
||||
|
||||
```
|
||||
1、在oc文件中使用swift文件。
|
||||
选中项目TARGETS->Building Settings->搜索“Objective-C Genereated Interface Header Name”对应的名字。
|
||||
在oc文件中需要使用swift的地方,头文件导入上一步对应的名字。
|
||||
## apinotes 文件
|
||||
|
||||
|
||||
|
||||
经常在 Swift、OC 混编的时候,系统会给方法命名等做一些优化,比如 OC 侧的枚举,在 Swift 就是结构体。为了代码规范或者某些因素考量,我们需要做一些约定,不让编译器自动处理,比如一些常见的宏:
|
||||
|
||||
- `NS_SWIFT_NAME`
|
||||
- `NS_TYPED_EXTENSIABLE_ENUM`
|
||||
- `NS_REFINED_FOR_SWIFT`
|
||||
|
||||
宏来配置存在弊端,手动去处理一个工程、一个 SDK 的话,假设有10000个方法,工作量太大。
|
||||
|
||||
Xcode 推出解决方案:
|
||||
|
||||
- 创建 `SDK名称.apinotes` 文件
|
||||
- 放到 SDK 根目录下
|
||||
- 按照 yaml 格式,编写内容
|
||||
|
||||
比如:
|
||||
|
||||
```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](https://clang.llvm.org/docs/APINotes.html)
|
||||
|
||||
|
||||
|
||||
该方案是 Apple 标准做法,不是骚操作,Objc 源码中也有使用。如下所示
|
||||
|
||||
<img src="./../assets/APINoteInObjcSourceCode.png" style="zoom:30%" />
|
||||
|
||||
Reference in New Issue
Block a user