Fork me on GitHub

Xcode工程项目中实现Swift和OC混编 相互引用

一、OC工程中的相互引用

适用于初始工程为 OC 后续引入 Swift 的场景,初始工程为 Swift 后续引入 OC 的直接看第二节

OC 工程中引用 Swift

  1. 通过 CocoaClass 新建一个 Swift 文件

创建Swift文件

  1. 填好文件名,->create,弹出是否要创建桥接文件的提示框

填写Swift文件名
创建桥接文件

  1. 如果没有弹出是否创建桥接文件的提示框,则进入配置工程里看看此处是否为空,如果不是空的,就删掉,因为是否创建桥接文件只会弹出一次,若你已经选择了一次 not create,则下次不会再提示,想要再次创建桥接文件需在自己创建一个头文件,并在这里填写对应路径。或者这里将设置清空,再从1开始。

设置桥接文件

  1. 至此,文件创建好了,配置也做好啦,开始上代码,在需要引用 Swift 的 OC 文件中导入头文件

import “xxx-Swift.h”。(xxx(一般为工程名)-Swift.h,此文件为Xcode隐式创建)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 此文件为 OC 工程中的 OC 文件
// ViewController.m

#import "ViewController.h"
#import "xxx-Swift.h" // xxx(一般为工程名)-Swift.h,此文件为 Xcode 隐式创建

@interface ViewController ()

@end


@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

TestClass *ar = [[TestClass alloc] init];
}

OC中引用Swift完毕。

OC 工程中新建 Swift 并引用 OC

刚刚已经创建了 Swift 文件和桥接文件,现在我们需要在桥接文件里引入要引用的OC类的头文件。

1
2
3
4
5
6
7
// OCSwiftDemo-Bridging-Header.h 桥接文件

//
// Use this file to import your target's public headers that you would like to expose to Swift.
//

#include "ViewController.h"

之后便可以在 TestClass 文件里进行引用。

1
2
3
4
5
6
7
8
// 此文件为OC工程中创建的Swift文件
// Swift文件中调用OC的类
import UIKit

class TestClass: NSObject {

let vc: ViewController = ViewController()
}

二、Swift 工程中的相互引用

适用于初始工程为 Swift 后续引入 OC 的场景

Swift 工程中新建 OC 文件并引用 Swift

如果你是看到前面的提示,直接过来看这里的话,很抱歉,您可能还需要看一遍前面的步骤,因为有配图更好理解。

Swift 工程中创建 OC 类并和 Swift 相互引用的方式,和前面 OC 工程创建 Swift 文件并相互引用的步骤是一致的(所以没有配图)。

  1. 通过 CocoaClass 新建一个 OC 文件

  2. 填好文件名,->create,弹出是否要创建桥接文件的提示框

  3. 如果没有弹出是否创建桥接文件的提示框,则进入配置工程里看看此处是否为空,如果不是空的,就删掉,因为是否创建桥接文件只会弹出一次,若你已经选择了一次 not create,则下次不会再提示,想要再次创建桥接文件需在自己创建一个头文件,并在这里填写对应路径。或者这里将设置清空,再从1开始。

  4. 至此,文件创建好了,配置也做好啦,在需要引用 Swift 的 OC 文件中导入头文件(#import “xxx-Swift.h” // xxx(一般为工程名)-Swift.h,此文件为 Xcode 隐式创建),即可调用相关类文件。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 此文件为 Swift 工程中的 OC 文件
// TestClass.m

#import "TestClass.h"
#import "xxx-Swift.h" // xxx(一般为工程名)-Swift.h,此文件为Xcode隐式创建

@implementation TestClass

- (instancetype)init {
self = [super init];
if (self) {

}
return self;
}

- (void)updateView {
ViewController *vc = [[ViewController alloc] init];
NSLog(@"%@", vc);
}

@end

Swift 工程中引用 OC 文件

  1. 刚刚已经创建了 OC 文件和桥接文件,现在我们需要在桥接文件里引入要引用的 OC 类的头文件。
1
2
3
4
5
6
7
// SwiftOCDemo-Bridging-Header.h 桥接文件

//
// Use this file to import your target's public headers that you would like to expose to Swift.
//

#include "TestClass.h"
  1. 之后便可以在 Swift 文件里进行引用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 此文件为 Swift 工程中的 Swift 文件
// ViewController.swift Swift 文件中调用 OC 类

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let tc = TestClass()
tc.updateView()
}
}
------------- 本文结束感谢您的阅读 -------------