Swift与Objective-C的兼容能力允许你在同一个工程中同时使用两种语言。你可以用这种叫做“mix and match”的特性来开发基于混合语言的应用。使用Swfit的最新特性--“mix and match”,你可以实现应用的一部分功能,并无缝地并入已有的Objective-C的代码中。
Mix and Match 概述
Swift与Objective-C文件可以在一个工程中并存,不管这个工程原本是基于Objective-C还是Swift。你可以直接往现有工程中简单地添加另一种语言的文件。这种自然的工作流使得创建混合语言的应用或framework target,与用单独一种语言时一样简单。
编写混合语言的工作流程只有一点点区别,这取决于你是在写应用还是写框架。下面描述了用两种语言在一个target中导入模型的情况,后续章节会有更多细节。
在同一个App Target中进行代码导入
要在同一个app target中导入Objective-C文件供Swift使用,你需要依赖Objective-C的桥接头文件(Objective-C bridging header)来暴露给 Swift。当你添加 Swift 文件到现有的Objective-C应用时,Xcode 会自动创建这些头文件,反之亦然。
如果你同意,Xcode 会在源文件创建的同时生成头文件,并用product的模块名加上 -Bridging-Header.h命名。如果手动创建,则按如下步骤。
一. swift调用Objective-C代码
Xcode对于Swift调用Objective-c代码,除宏定义外,其它支持相对完善。
1.1 使用Objetvie-c的第一步
告诉Xcode、哪些Objective-c类要使用,新建.h头文件,文件名可以任意取,建议采用“项目名-Bridging-Header.h”命令格式。
Swift之IOS项目,在Xcode6创建类文件,默认会自动选择OS X标签下的文件,这时一定要选择iOS标签下的文件,否则会出现语法智能提示不起作用,严重时会导致打包出错。
1.2 Target配置,使创建的头文件生效
设置Objective-C Bridging Header时,路径要配置正确,写法如下:
$(PROJECT_DIR)/*-Bridging-Header.h
二. Objective-c调用Swift代码
2.1 Objective-c调用Swift代码两个步骤
第一步 告诉Xcode哪些类需要使用(继承自NSObject的类自动处理,不需要此步骤),通过关键字@objc(className)来标记
importUIKit
@objc(ILWriteBySwift)
class ILWriteBySwift{
var name:String!
class func newInstance()->ILWriteBySwift{
return ILWriteBySwift()
}
}
第二步引入头文件,Xcode头文件的命名规则为
$(SWIFT_MODULE_NAME)-Swift.h
配置如下:
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"
//通过代码导入类
@class ILSwiftBean;
在Objevtive-c的.m文件最上面,添加
#import "ILSwift-Swift.h"
出现Use of undecalared identifier错误或者找不到方法,如下:
引起的原因有以下几种可能:
1.使用的Swift类不是继承自NSObject,加入关键字即可
2.SWIFT_MODULE_NAME)-Swift.h没有实时更新,Xcode->Product->Build
3.此Swift文件中使用了Objective-c不支持的类型或者语法,如private
出现部分方法找不到的问题,Xcode无智能提示:
此方法使用了Objective-c不支持的类型或者语法
苹果官方给出的不支持转换的类型
Generics
Tuples
Enumerations defined in Swift
Structures defined in Swift
Top-level functions defined in Swift
Global variables defined in Swift
Typealiases defined in Swift
Swift-style variadics
Nested types
Curried functions
参考文章: