OC项目中使用Swift

本文版权归作者所有,如需转载请联系孟祥月 
CSDN博客:http://blog.csdn.net/mengxiangyue 
独立博客:http://mengxiangyue.com

最近公司的项目开始计划使用Swift,由于原先的工程都是使用OC编写的,不可能一下全部转换成Swift,所以采用OC与Swift混编的方式是最好的选择。这篇文章只是一个简单的介绍,并没有太高深的知识。

我新建了一个演示的OC工程,当然你可以使用你已经存在的OC的工程。如果我们想要在OC工程中使用Swift的代码,Swift的代码默认是使用module管理的,同样这里我们也需要把我们的Swift代码作为一个module暴露给我们的OC工程,修改下面的配置: 

上面的修改了一个配置项,有一个Product Module Name在后面会使用。

在工程里面点击File/New/File…,选择iOS/Source/Cocoa Touch Class,按照如下填写创建一个新的文件: 

上图中的Subclass of一定要设置为NSObject或其子类,否则OC工程将不会找到该类。

点击确认后会选择保存路径,点击Create,出现如下界面: 

这个界面是询问是否创建桥接的头文件,这个文件在Swift调用OC代码的时候比较管用,但是在OC中调用Swift的时候我发现没有什么卵用。

选择Don’t Create按钮。

在Test.swift中添加如下的代码(解释都在注释里面了):

import UIKit

/*
如果Swift类想要被OC发现,必须继承自NSObject并且使用public标记,并且该类中想要被OC访问的方法也必须使用public标记,具体知识可以去看Swift的访问控制
原因:Swift的代码对于OC来说是作为一个module存在的 当然全局的Swift函数,我还没发现怎么在OC中访问,如果哪位清楚还请告诉一下,谢谢!
*/ public class Test: NSObject {
public func log() {
print("这是Swift的方法")
}
} public func globalLog() {
print("这是Swift全局的log方法")
}

我们在我们想要调用Swift类的方法里面引入头文件:”Product Module Name-Swift.h”,其中Product Module Name替换成在上面配置项中显示的内容,例如:

#import "ViewController.h"
// 引入Swift头文件
#import "OCAndSwift-Swift.h" @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 使用Swift的类
Test *test = [[Test alloc] init];
[test log];
} @end

这样我们就能够在OC中使用Swift的代码了,最后还要说明一点:”Product Module Name-Swift.h”(例子中的是OCAndSwift-Swift.h),是由编译器自动生成的,如果import后没有提示,编译一下。并且只有在工程中包含至少一个Swift文件的时候,才会自动生成这个文件,所以如果工程中如果没有Swift文件的时候,就算在配置中设置对了,import该文件也会报错。

Swift项目中使用OC

首先,在工程的 Build Settings 中把 defines module 设为 YES.

然后,把 product module name 设置为项目工程的名字

最后一步,在你的OC文件中导入 ProjectName-Swift.h.

注意:ProjectName-Swift.h 这个文件是系统自己创建的,千万不要手动创建。

最新文章

  1. 冰冻三尺非一日之寒--web来了
  2. LNMP虚拟机开发环境配置--vagrant+virtualbox+ubuntu14.04
  3. 替换html元素
  4. CF722C. Destroying Array[并查集 离线]
  5. < java.util >-- Iterator接口
  6. Varnish CentOS 6.4 x64
  7. 马踏棋盘算法递归+回溯法实现 C语言
  8. [IB配置]PeopleSoft如何重置网关属性administrator密码
  9. POJ 3259 Wormholes Bellman_ford负权回路
  10. jquery easyui datagrid动态改变title的值
  11. 逆向工程核心原理-IA-32寄存器
  12. VB中StdPicture尺寸(Width,Height)转像素单位
  13. 在CentOS7上安装Zabbix3.0
  14. dedecms批量修改文章为待审核稿件怎么操作
  15. python全栈开发笔记--------条件语句
  16. 浅尝Vue.js组件(一)
  17. mongoose系列——几行代码实现CRUD
  18. Redis学习笔记--Redis配置文件redis.conf参数配置详解
  19. POJ 2706 Painter
  20. 记一次webservice的超时时间设置

热门文章

  1. socketserver,threading
  2. atcoder 2579
  3. Visual Studio 2017 Key激活码
  4. ie7,ie8 js中变量名和页面元素ID重名,报错
  5. linux防火墙添加端口
  6. java 学习原生jdbc
  7. 在U盘打造个性化PE工具箱+KALI(Persistence)+存储的工作站
  8. JavaScript base64多图上传
  9. 关于int类型表示的最大位数
  10. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue