swift开源那么久了,大家肯定了解过并且使用过swift,使用oc开发那么久,项目比较大的情况下,肯定不能一下全部换成swift,有的同学可能会先使用oc与swift混合编程,所以就涉及到混合编程的一些知识和文件的坑,我在这里简单介绍一下,有不足之处,可以查看下方联系我哦。
一、桥接文件project-Bridging-Header.h
在oc项目中创建swift文件的时候,xcode会提示是否创建这个文件,创建好以后,在build setting下的swift compler-general的objective-c bridging header下有这个文件的路径,这个路径一定要写对,否则会报错,当然这个文件也可以手动创建,创建名字要按规定,这个文件主要是进行swift调用oc中的方法和属性使用,这个文件中要import引入需要在swift中调用的oc的类名。
二、project-Swift.h文件
这个文件不用创建,只要使用了混编,并且创建了桥接文件,project-Swift.h文件就会自动创建,否则是没有的,这个文件的作用主要是混编时,在oc中使用swift的文件。
三、project-Swift.h是做什么的
我们可以定位到这个文件查看源码
里面是一些宏定义和导入的一些框架,最下面是swift对应的oc代码,现在我只是创建了SwiftViewController.swift的文件,所以只@interface了这一个文件,所以如果我们有很多swift文件的时候,在这个文件中会出现对应的oc的代码,到这里我们应该已经明白了,当我们使用oc调用swift文件时,编译器会帮我们定为到这个文件,调用这个文件对应的oc的方法或者属性。
那么在swift5.0中我们在swift中写的方法和属性怎么会添加到这个文件哪,当我们创建方法或者属性的时候,需要在方法或属性前面加上@objc来进行修饰,这样会在project-Swift.h文件中自动添加上对应的oc代码:
如果我们不加@objc的话,在project-Swift.h文件中不会出现对应的oc代码,那么我们就无法使用oc调用该方法
对于 枚举类型也是使用同样的方法,如前面截图,但是对于swift特有的枚举,使用这样的方法就不行了,比如CouponResult这个枚举,他不是NSInterger类型,并且枚举中是带有参数的方法,在oc中是没有这种枚举的,所以如果在前面加@objc会报错,在oc中也是不可用的。
当然如果使用枚举,在project-Swift.h同样会存在oc的代码
当我们在OC文件中使用KVO对swift文件进行监听,在被监听的属性或者对象需要使用@dynamic进行修饰,否则当属性值改变的时候,是监听不到的。
@objc dynamic var name: String?
@objc(test:)
func aaaaaa(text: String) {
let string = CouponResult.Result(test: text)
switch string {
case .Result(let str):
print(str)
break
}
}
在上面的代码中,我们还可以使用@objc()括号中定义方法名,来让区分OC和Swift调用不同的方法名,方法体是不变的。
四、oc项目导入#import “project-Swift.h”报错
如果我们项目名中包含.符号,在我们引入project-Swift.h文件时会报错,比如我们的工程名叫oc.swift,只要在Build Setting->Packaging->Product Bundle Name名字为oc_swift,然后引入的时候写#import “oc_swift-Swift.h”就不会报错了,因为project-Swift.h本质上是ProductBundleName-Swift.h。
如果报错了,可以从以下方面着手检查:
- 检查项目名是否合法
- 检查项目名是否正确,不能有错误
- 检查桥接文件的路径是否正确。