前言
写项目时发现有的方法OC时没有,需要用swift来实现的,于是就跳进了混编配置的坑,参照了许多博客,爬了一上午才爬出来,在这总结一下我挖坑和填坑的经历,如有错误,欢迎纠正。
- 需求:OC项目中使用新建swift文件的类
- 问题:新建swift文件时,笔者的Xcode没有提示生成桥接文件,需要自己配置并手动创建桥接文件,最后在OC中成功引用swift写的类
- 项目说明:没有使用framework与pod
重要的配置及文件认识
-
Target–Building Setting–Packing
- Defines Module 设置为YES
目测是配置项目是否接收混编的(目测哈~)
- Product Module name和Product name设置为项目名
后面配置参数时需要引用
- Target–Building Setting–Swift Compiler-General
- Objective-C Bridging Header:桥接文件路径配置,桥接文件名必须是“ProjectName-Bridging-Header.h”,这个文件在Swift使用OC类时使用
- Objective-C Generated Interface Header Name:这个文件路径是混编时,系统自动生成的Swift文件对应的Objective-C的头文件路径,OC中使用Swift时使用。这个文件默认为“工程名-Swift.h”,一般不作改动。
遇到的问题及解决方案
-
Xcode不能提示自动生成桥接文件
OC中用Swift时的桥接文件“工程名-Swift.h”:注意,虽然系统没有提示自动生成了该文件,但是是生成了的(划重点),不需要自己再手动创建!!!!(笔者很傻地手动创建了一个,在路径配置和swift类不能识别中浪费了很多时间)。
Swift中用OC的文件可以自己创建,详情再看看刚刚说的Objective-C Bridging Header
-
混编配置过程中Xcode报错
-
若错误为“XXX……not find” (文件找不到)或者“error opening ……” 一般是文件路径配置错误,注意使用相对路径(直接为创建的头文件名),不要使用绝对路径(/User/……)!!
-
若错误为“Failed to emit precompiled header for bridging header ”,在buildsetting中的以下两个路径中添加对应的设置,重现编译即可解决
- 添加
$(inherited) non-recursive
到Search Path -> Header Search Paths
- 添加
${PODS_ROOT} recursive
到Search Path -> User Header Search Paths
- 添加
-
配置好之后在文件中的使用
桥接文件实际上就是转换语言
-
在OC中使用Swift的类
-
Swift类最好直接或者间接地继承NSObject,不然很可能不会被OC识别出来
-
Swift类前使用
@objcMembers
表示该类及其定义的成员变量和方法可以被OC识别,如@objcMembers public class earthSCNView: NSObject {}
-
在需要使用swift类的OC文件中导入“工程名-Swift.h”文件就可以了,不需要再import其他的swift文件,如
#import "物语-Swift.h"
-
-
在Swift中使用OC
目前没有使用,大概就是在“ProjectName-Bridging-Header.h”中导入要使用的OC头文件
其他
更详细的可以看看这篇博客:Swift和Objective-C混编的注意啦