一、概要
首先看《The Swift Programming Language》中提到“Swift’s compatibility with Objective-C lets you create a project that contains files written in either language. ”,意思是在一个项目中可以混合使用Swift和Objective-C,你可能有疑问了:
1、如何让两种语言在一个项目中使用?
2、混编的项目是“Swift项目”还是“OC项目”?
3、混编过程中,需要注意哪些细节?
仅凭看文档可能会感觉没有头绪,所以还是实际动手试一试吧。
二、混编
1、OC项目中混编
(1)首先创建一个项目,命名TestOC,语言选择Objective-C,不熟悉的可以参考这里
(2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择Swift,命名为FileTest,选择Create的时候,会弹出如下页面:
选择Yes,然后Xcode不仅创建了 FileTest.swift 文件,还创建了 TestOC-Bridging-Header.h 文件
这个文件什么作用,看文档:
向一个OC项目中添加Swift文件或者向一个Swift项目中添加OC文件,Xcode会自动生成ProName-Bridging-Header.h,作用就是告诉OC项目或Swift项目,这个Swift文件或者OC文件对外提供的内容,从命名“Bridging”也能大概猜到文件的用意。
选择直接编译会报错,不要着急,修改刚创建的文件 FileTest.swift 中的代码:
import Foundation @objc(FileTest) class FileTest: NSObject { @objc(initWithData:) init (data: String) { println(data) } }
选择Swift文件中的类也定义好了,但发现在OC没办法调用,因为OC选择找不到 FileTest 类,这就需要配置一个参数:Build Setting -> Product Module Name,默认是没有配置的,Target -> Build Setting ->Defines Module修改成Yes:
选择在需要使用Swift文件类的地方引入头文件:#import "MyTest-Swift.h",然后在看效果:
Swift中定义的类,可以在OC中使用了,MyTest-Swift.h 文件是什么?他是Xcode自动创建的,点击进去看看里边有什么:
这样就几乎明白个七七八八了。
现在可以实现OC中调用Swift了,那Swift中如何调用OC呢,直接修改Swift文件:
发现这样不行,Swift文件没有找到ViewController这个OC的文件,这个时候桥接头文件就有用处了,修改 TestOC-Bridging-Header.h
再次编译运行,发现没问题了。
2、Swift项目中混编
(1)首先创建一个项目,命名TestSwift,语言选择Swift,不熟悉的可以参考这里
(2)创建好项目后,在项目中添加一个新文件 New File -> Cocoa Class 语言选择OC,命名为FileTest,点击Create后仍然会提示是否创建桥接文件,选择Yes:
下面来说说Swift文件中调用OC:
打开ViewController.swift,添加如下代码
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var test = FileTest() } func customFun() { } func customFun1() { } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
因为OC没有告诉Swift可以访问我哪些内容,很简单,在桥接文件中添加: #import"FileTest.h",告诉Swift,OC中FileTest可以访问:
现在编译运行,没问题了吧!
再来说说OC文件中调用Swift:
在 FileTest.m 中添加代码:
#import "FileTest.h" @implementation FileTest - (void) test { ViewController *viewCtr = [[ViewController alloc] init]; NSLog(@"%@", viewCtr); } @end
#import "FileTest.h" #import "MyTest-Swift.h" @implementation FileTest - (void) test { ViewController *viewCtr = [[ViewController alloc] init]; NSLog(@"%@", viewCtr); } @end
如果想使用第三方Framework怎么办?官方文档这么说的:
其实也不难,打开项目配置文件Target -> Build Phases -> Link Binary With Libraryer,添加你要导入的Framework,如果是第三方的库,可以选择Add Other(我这里选择的是第三方的Framework,也是我自己打包的库):
这样目录结构中可以看到库了:
使用很简单,首先还是要配置下桥接文件,比如我想使用 kalagame-library.framework库中的 KalaGameApi.h 就要这样配置:#import"kalagame-library/KalaGameApi.h"
更多内容见官网文档
由于对官网文档的理解可能不到位,可能对问题的理解有偏差,如果发现错误,还请指正,不胜感激。更多内容请点击这里
Demo下载
欢迎加入群共同学习和进步:QQ群:170549973