一、解决问题
Swift项目需要使用封装好的Objective-c组件、第三方类库,苹果提供的解决方案能够处理日常大部分需求,但还不能称之为完美,混编过程中会遇到很多问题。本文将Swift兼容Objective-c的问题汇总,以帮助大家更好的使用Swift,内容列表如下:
1. Swift调用Objective-c代码
2. Objective-c调用Swift代码
3. Swift兼容Xib/Storyboard
4. Objective-c巧妙调用不兼容的Swift方法
5. 多Target编译错误解决
6. 第三方类库支持
二、基础混合编程
Swift与Objective-c的代码相互调用,并不像Objective-c与C/C++那样方便,需要做一些额外的配置工作。无论是Swift调用Objective-c还是Objective-c调用Swift,Xcode在处理上都需要两个步骤:
2.1 Swift调用Objective-c代码
Xcode对于Swift调用Objective-c代码,除宏定义外,其它支持相对完善。
2.1.1 使用Objetvie-c的第一步,
告诉Xcode、哪些Objective-c类要使用,新建.h头文件,文件名可以任意取,建议采用“项目名-Bridging-Header.h”命令格式。
Tips
Swift之IOS项目,在Xcode6创建类文件,默认会自动选择OS X标签下的文件,这时一定要选择iOS标签下的文件,否则会出现语法智能提示不起作用,严重时会导致打包出错。
2.1.2 第二步,Target配置,使创建的头文件生效
设置Objective-C Bridging Header时,路径要配置正确,例如:创建的名为“ILSwift-Bridging-Header.h”文件,存于ILSwift项目文件夹的根目录下,写法如下:
ILSwift/ILSwift-Bridging-Header.h
当然,在新项目中,直接创建一个Objective-c类,Xcode会提示:
直接选择Yes即可,如果不小心点了其它按钮,可以按照上面的步骤一步一步添加。
2.2 Objective-c调用Swift代码
2.2.1 Objective-c调用Swift代码两个步骤
第一步告诉Xcode哪些类需要使用(继承自NSObject的类自动处理,不需要此步骤),通过关键字@objc(className)来标记
import UIKit
@objc(ILWriteBySwift)
class ILWriteBySwift {
var name: String!
class func newInstance() -> ILWriteBySwift {
return ILWriteBySwift()
}
}
第二步引入头文件,Xcode头文件的命名规则为
$(SWIFT_MODULE_NAME)-Swift.h
示例如下:
#import "ILSwift-Swift.h"
Tips
不清楚SWIFT_MODULE_NAME可通过以下步骤查看
2.2.2找不到$(SWIFT_MODULE_NAME)-Swift.h
1.遇到此问题可按以下步骤做常规性检查
1.确定导入SWIFT_MODULE_NAME)-Swift.h头文件的文件名正确
2.SWIFT_MODULE_NAME)-Swift.h在clean后没有重新构建,执行Xcode->Product->Build
2.头文件循环
在混合编程的项目中,由于两种语言的同时使用,经常会出现以下需求:在Swift项目中需要使用Objectvie-c写的A类,而A类又会用到Swift的一些功能,头文件的循环,导致编译器不能正确构建$(SWIFT_MODULE_NAME)-Swift.h,遇到此问题时,在.h文件做如下处理
//删除以下头文件
//#import "ILSwift-Swift.h"
//通过代码导入类
@cl