一、概要

首先看《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的时候。会弹出例如以下页面:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6aG9uZ2Z1MjAxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

选择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)
}
}

这里看到了 @objc()这样的奇怪到写法,官网是这样描写叙述的。意思是用@objc()想让一个Swift类被OC调用

选择Swift文件里的类也定义好了,但发如今OC没办法调用,由于OC选择找不到 FileTest 类,这就须要配置一个參数:Build Setting -> Product Module Name,默认是没有配置的,Target -> Build Setting  ->Defines Module改动成Yes:

选择在须要使用Swift文件类的地方引入头文件:#import "MyTest-Swift.h",然后在看效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6aG9uZ2Z1MjAxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

Swift中定义的类,能够在OC中使用了。MyTest-Swift.h 文件是什么?他是Xcode自己主动创建的,点击进去看看里边有什么:

这样就差点儿明确个七七八八了。

如今能够实现OC中调用Swift了。那Swift中怎样调用OC呢。直接改动Swift文件:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6aG9uZ2Z1MjAxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

发现这样不行,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能够訪问我哪些内容,非常easy。在桥接文件里加入: #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

发现报错。找不到ViewController,没关系,缺少头文件。Target -> Build Setting  ->Product Module Name ,改动为MyTest,Target -> Build Setting  ->Defines Module改动成Yes。在FileTest.m中加入#import"MyTest-Swift.h",如今再编译执行,没问题了吧。

#import "FileTest.h"
#import "MyTest-Swift.h" @implementation FileTest - (void) test {
ViewController *viewCtr = [[ViewController alloc] init];
NSLog(@"%@", viewCtr);
} @end

点击进入Xcode生成的文件 MyTest-Swift.h ,全部可调用的Swift代码都在这里,包含我们自己写的方法:

假设想使用第三方Framework怎么办?官方文档这么说的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6aG9uZ2Z1MjAxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

事实上也不难,打开项目配置文件Target -> Build Phases  -> Link Binary With Libraryer,加入你要导入的Framework,假设是第三方的库,能够选择Add Other(我这里选择的是第三方的Framework,也是我自己打包的库):

这样文件夹结构中能够看到库了:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl6aG9uZ2Z1MjAxMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

使用非常easy,首先还是要配置下桥接文件,比方我想使用 kalagame-library.framework库中的 KalaGameApi.h 就要这样配置:#import"kalagame-library/KalaGameApi.h"

然后这样调用: var test1 = KalaGameApi(),如今主要的混编知识点就介绍完了。

很多其它内容见官网文档

因为对官网文档的理解可能不到位。可能对问题的理解有偏差,假设发现错误。还请指正。不胜感激。很多其它内容请点击这里

Demo下载

欢迎增加群共同学习和进步:QQ群:170549973

iOS8开发~Swift(五)Swift与OC混编的更多相关文章

  1. iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法

    1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...

  2. Swift数独游戏优化——C++与OC混编、plist自动生成

    一.为什么要C++与OC混编? 在我之前的数独游戏中涉及到的数独游戏生成算法是参考的网上其他人的算法,是利用C++来实现的.   但是在我的例子中我发现这样存在一定的局限性: 1.我是利用Termin ...

  3. Swift & OC 混编 浅析

    转载自:http://www.infoq.com/cn/articles/wangyi-cartoon-swift-mixed-practice?utm_campaign=rightbar_v2&am ...

  4. swift c++ oc 混编

    http://www.tuicool.com/articles/QZNrErM iOS 里面 Swift与Objective-C混编,Swift与C++混编的一些比较 时间 2015-03-23 23 ...

  5. cocoapod Podfile use frameworks swift/oc混编 could not build module xxx

    前置: 知名的pod: AFNetworking 我自己的pod:  AFNetworking+RX  3.1.0.18 里面有一段代码是: #import <Foundation/Founda ...

  6. Swift和OC 混编

    1.首先创建一个Swift工程 2.导入或者创建一个OC文件(.h和.m) 3.再创建一个桥连接文件 4.然后文件样子为 5.在桥接链接里面导入头文件 6.通过targets->->bui ...

  7. 在OC项目中实现swift与oc混编 相互引用

    --------------------------------------------------------Begin--------------------------------------- ...

  8. iOS 静态类库 打包 C,C++文件及和OC混编

    iOS 静态类库 编译 C,C++ 我们都知道,OC 原生支持C, 在 创建的 OC类的 .m 里面,可以直接编写C的代码: 同样 Xcode 也支持 OC ,C++的混编,此时,我们通常把OC创建的 ...

  9. iOS之 C++与oc混编

    声明:本文只是随笔,自己做个笔记方便以后查阅如要转载,注明出处.谢谢! 2016年第一篇随笔!!! 由于最近要搞一个项目用到c++的一些api所以要混编,于是就记录下这个过程中的一些细节上的东西! O ...

随机推荐

  1. Python: PS 图像调整--颜色梯度

    本文用 Python 实现 PS 中的色彩图,可以看到颜色的各种渐变,具体的效果可以参考以前的博客: http://blog.csdn.net/matrix_space/article/details ...

  2. prezi,mfc,toefl,java

    1 用prezi做ppt然后讲 2 用mfc把算法封起来 3 做tpo,背单词 4 写java 哪个任务都很难办.而且脚还没好.

  3. js中作用域链的问题

    为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...

  4. js封装each函数

    function each(ele,callback){ if(Object.prototype.toString.call(ele) == "[object Array]"){ ...

  5. Java调用Python遇到的一系列问题与解决方案

    首先,百度了几个方法 1.用jython里的一个jar包,jython.jar,里面封装了一个专门调用Python的类, 但是不知道为什么我用Java一调用就报错,因此放弃.   2.用runtime ...

  6. 陌上开花(CDQ分治)

    题解 三维偏序裸题... 一般三维偏序是第一维排序,第二维CDQ分治,第三维树状数组. 模板题还是看代码吧... #include<iostream> #include<cstrin ...

  7. memset函数的用法

    重点需要注意一个细节:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充. 因此:如果int array[10]: memset(array, 1, 10):然后再把array ...

  8. springMVC的rest风格的url请求

    rest是一个架构风格,用url来访问网络上的任何资源.rest的一种思想就是用http中的动作get,post,put,delete,来进行增删改查. 这里介绍的是springMVC的rest请求. ...

  9. ArcSDE学习笔记--------增、删、改、查操作

    建立连接 package org.lq.ssm.gp.controller; import com.esri.sde.sdk.client.SeConnection; import com.esri. ...

  10. PHP开发环境&amp;MySQL下载安装及配置流程

    PHP开发环境&MySQL下载安装及配置流程 因工作须要,从0開始学PHP,前几天看完视频教程后開始搞开发环境,到今天才好.这里把安装配置流程梳理一下分享出来. 一.概述 要搭建一个开发环境无 ...