有两种方式创建桥接文件
1、自动创建:直接导入OC文件,这时会提示创建桥接文件,直接创建;
2、手动创建:新建文件选择创建一个头文件Header File,命名格式为yourprojectname-Bridging-Header.h(也可以随意的起名字);然后build setting 搜索 objective-c bridging Header 设置头文件路径:
在项目的同名文件夹中使用以下路径
(PROJECT_NAME)/yourprojectname-Bridging-Header.h
在项目的根目录使用以下路径
1、直接导入:直接在头文件中#import 就可以了;
2、pod集成导入:在build Settings中搜索User Header Search Paths,然后添加${SRCROOT} , 选择Recursive 。
在我尝试用swift桥接使用一个OC的库的时候,出现了下列问题
但是删除公司自行开发的存储常用第三方静态库包的源之后重新执行pod install 成功了?这是为什么呢?原因其实很简单,因为实际项目中使用use_frameworks!强制以动态库形式pod依赖库,但是因为我使用的源中其实第一监测到的是静态库,所以就报错了。【注】使用swift开发时, pod第三方库的时候要注意对于静态库的依赖
动态库依附
如果你使用普通mainbundle的path方法获取的话会发现获取不到对应资源文件,这是为什么呢?因为swift的pod文件使用use_frameworks!限制了cocoapods将第三方库以动态库形式管理,那么就注定了直接使用mainbundle-path是访问不到的
解决方案参考 here :也就是路径拼接的最后结果是aaaaaa项目/Frameworks/库名.framework/bundle名.bundle,如果库名和bundle一致为bbb的话,那就是aaaaaa项目/Frameworks/bbb.framework/bbb.bundle
其实可以通过查看项目实际运行地址打开包内容查看具体路径
但是又有一个新问题,因为SDK内部使用SDK本身资源图片是使用的mainbundle-path形式访问,所以这时实际上是访问不到资源图片的,就导致了图片显示异常,这怎么破?
在swif中使用OC的枚举值,直接书写枚举值是错误的,如下例子所示:
标注1直接使用枚举值会报错未定义,这个时候应该使用标注2的形式 枚举名称.枚举值,需注意这里的枚举值是去掉了枚举定义重复部分的值,例如WYLoginStepType.loginAccount在枚举的实际定义中为WYLoginStep_loginAccount,而调用时是去除了与枚举名称中重复的部分(若重复部分后序为下划线则下划线也去除)WYLoginStep_,而直接使用.loginAccount进行调用的
因为实际上swift帮你生成了一个临时文件来存储这些枚举值:
另外从上述两个例子中也可以验证:此文件中的枚举值符合上述去除了与枚举名称中重复的部分(若重复部分后序为下划线则下划线也去除)这一规则。
在ios的OC和Swift混合开发无非是2种,一种是在OC的项目中使用Swift语言开发,这里就需要创建Swift文件(或者引用Swift写的的第三方库),另一种是在Swift项目中使用OC语言开发,这里就需要创建OC文件,(或者引用OC写的的第三方库)
首先我们在一个已有的OC的项目中,创建一个Swift文件
这里Xcode就会自动提示我们如:图1
Would you like to configure an Objective-C bridging header?
Adding this file to ocProjectUseSwift will create a mixed Swift and Objective-C target. Would you like Xcode to automatically configure a bridging header to enable classes to be accessed by both languages?
提示我们创建一个桥接的头文件,当我点击 “ Create Bridging Header”,Xcode就给我们自动创建,自动创建的规则是:项目名+ "-Bridging-Header.h" 如图2
同时在项目中创建一个Swift文件
然后在在 targets ->Build Settings ->Packaging 中设置Defines Module 为YES
设置完后开始使用,怎么在oc中使用Swift的类呢?
重点: 在文件中引用 #import "ocProjectUseSwift-Swift.h" 记住不是我创建的SecondVC.swift,是“项目名-Swift.h"文件名 ,引入这个文件就引入了所有的Swift文件内的类、方法、属性
说明:这个文件是系统自动创建,自动添加所有我们创建的Swift的类的方法和属性
前提是要在方法和属性前面要加@objc 如图3:
用@objc声明好之后,在我们引用的是“项目名-Swift.h"文件名的 #import "ocProjectUseSwift-Swift.h" 内就看到有标记了如图4
这里分了3块,红色和绿色标记框内是我们自己标记的oc可用的属性和方法,蓝色框内是系统自己生成的oc可以初始化方法
具体使用就在oc文件中,如图5:
此事,在这个OC创建的项目中,我们创建的Swift文件怎么使用OC创建的类呢?
这里就用到我们创建的桥接头文件了,在图2中的桥接头文件,引入OC的头文件,如图6
就这样很简单,所以Swift文件的类都可以使用这个OC文件内的类了,使用起,和OC调用OC的类一样,如如图7和图8
Swift的项目中,第一次创建OC的文件,此时系统会自动帮我们创建桥接头文件,如图9
然后就有了和图2一样的桥接头文件,剩下的就和图6一样,在桥接头文件内引入头文件,即可使用OC的类,第三方库如果也是OC写的,在引入的时候也自动会加这个桥接头文件,当然一个项目只能加一次,加过的就不需要加了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)