Objective-C和Swift混合编程开发
创建混编的Framework工程
第一步:创建target为Framework的工程
打开Xcode6-Beta,菜单栏File—>New—>Project; 创建一个新的工程,工程模板选择iOS—>FrameWork & Library—>Cocoa Touch Framework,下一步进入工程选项设置,工程名根据自己的目的输入一个有意义的Framework的名字,关键的是Language:选项我们选择Swift而不是Objective-C。
- 新建项目:
- 选择模板:
- 配置项目名称和语言
第二步:创建Objective-C和Swift源代码文件
在第一步创建完项目之后,项目中默认会有一个和项目同名的接口文件:FirstFixed.h
然后我们分别创建一个Objective-C语言的类OCView(OCView.h/.m),和一个Swift语言的类SwiftView(SwiftView.swift),以及一个MixedView类(MixedView.swift)。
此三个自定义类文件的Demo目的分别是:
- OCView.h/m:开始主要用Objective-C语言实现,后面加入代码引用项目里的Swift代码写的SwiftView类。演示Objective-C创建UI类和在Objective-C中调用Swift语言编写的类或者函数。
- SwiftView.swift:这个是Swift语言实现一个简单类。演示Swift语言创建UI类。
- MixedView.swift:这个也是Swift语言实现的一个简单类。演示在Swift语言代码中调用Objective-C语言编写的类或者函数。
OCView.h内容如下:
//
// OCView.h
// FirstMixed
//
// Created by WuQiong on 6/3/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface OCView : UIView
@end
OCView.m内容如下:
//
// OCView.m
// FirstMixed
//
// Created by WuQiong on 6/3/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
#import "OCView.h"
//引入swift代码自动生成的接口文件,此文件会自动生成的。不要自己创建。
//此文件路径的命名格式为<ProjectName/ProductModuleName-Swift.h>,-Swift.h是固定后缀
#import <FirstMixed/FirstMixed-Swift.h>
@implementation OCView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
OCView *mView = [[OCView alloc] initWithFrame: CGRectMake(0, 0, frame.size.width/2, frame.size.height)];
[self addSubview: mView];
//在OC代码里使用Swift代码写的类
SwiftView *swiftView = [[SwiftView alloc]initWithFrame:CGRectMake(20,10, 20, 20)];
[self addSubview:swiftView];
}
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
SwiftView.swift内容如下:
//
// SwiftView.swift
// FirstMixed
//
// Created by WuQiong on 6/4/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
import UIKit
class SwiftView: UIView {
init(frame: CGRect) {
super.init(frame: frame)
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect)
{
// Drawing code
}
*/
}
MixedSwift.swift内容如下:
//
// MixedView.swift
// FirstMixed
//
// Created by WuQiong on 6/3/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
import UIKit
class MixedView: UIView {
init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.purpleColor()
//在swift代码里使用OC写的类。
//需要在build setting里的Objective-C Bridge Headers
//里设置所需要用的OC类接口文件的路径,而非目录路径。
let ocView = OCView();
self.addSubview(ocView);
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect)
{
// Drawing code
}
*/
}
如果只是在本项目中的Swift代码中调用指定的Objective-C代码,那只需要在工程设置页面的Build Settings中的Objective-C Bridge Headers里设置所需要用的指定OC接口文件的路径,而非目录路径。这样就可以在Swift文件里可见病使用了。 完全不需要在Swift代码里进行任何类似import这样的行为操作。
Objective-C Bridge Headers设置图示:
以上是我们自定义实现的一些代码,下面我们来看看Xcode自动生成的那个接口文件是什么样的: FirstFixed.h的内容:
//
// FirstMixed.h
// FirstMixed
//
// Created by WuQiong on 6/3/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for FirstMixed.
FOUNDATION_EXPORT double FirstMixedVersionNumber;
//! Project version string for FirstMixed.
FOUNDATION_EXPORT const unsigned char FirstMixedVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <FirstMixed/PublicHeader.h>
大家注意一下Xcode6-Beta自动生成的接口文件的最后一行注释,表达出了一个我们之前没遇到过的概念。那就是接口文件他也划分了public、private、project三个范畴的概念。这个大家可以去工程设置里的Build Phases里可以看到新版Xcode的变化。
到目前为止,我们的firstMixed.Framework项目就有空成功编译了。 但是现在的framework如果被引入到其他App项目去使用的话。那就只能使用里面的那2个Swift类,而不能使用OCView这个类。因为默认只导出了Swift代码写的类到这个框架的接口文件中,这个大家可以打开framework下对应的Headers目录查看个究竟。
好,如果我们需要把这个混合语言编写的framework中的Objective-C代码的接口文件也需要导出到此框架的接口文件中,即公开出去。这个时候我们需要做两个操作:
- 在工程设置页面的Build Phases里,把Headers中的Project栏目下的OCView.h这个Objective-C写的接口文件拖拉到上面的Public栏目下,这样就会把Objective-C写的类和函数的接口给公开给框架的使用者。
- 在Xcode6-Beta自动生成的FirstMixed.h接口文件的最后加入一行导入所要公开的接口文件:
//
// FirstMixed.h
// FirstMixed
//
// Created by WuQiong on 6/3/14.
// Copyright (c) 2014 长沙戴维营教育. All rights reserved.
//
#import <UIKit/UIKit.h>
//! Project version number for FirstMixed.
FOUNDATION_EXPORT double FirstMixedVersionNumber;
//! Project version string for FirstMixed.
FOUNDATION_EXPORT const unsigned char FirstMixedVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <FirstMixed/PublicHeader.h>
#import <FirstMixed/FirstMixed.h> //本接口文件必须在项目的Build Phases页面中的Headers栏里面设置为public,否则编译出错。
其实,有经验的同学应该会意识到,上面第二条可以不在最后加这接口文件,这里加到框架的接口文件后面是为了统一接口。简单化。
这样,把工程编译完后,就会生成一个FirstMixed.framwork。把他加入到其他App工程中后。就可以只有的使用framework中的Objective-C和Swift的公开的所有类和函数了,不管是Objective-C还是Swift的,都可以。
第三步:项目代码测试和视频演示教程
视频临时观看地址:http://www.ubuntucollege.cn/course/29/learn#lesson/348 第一课时
Objective-C和Swift混合编程开发的更多相关文章
- Object-C与标准C/C++混合编程
转自:http://www.xue5.com/Mobile/iOS/661674.html 如何将C++和Object-C混合编程开发IOS软件(Object-c调用C++) 原文网址:http:// ...
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- Object-C与Swift混合开发
Object-C作为Apple的iOS App开发语言服务了很多个年头,2014年Apple推出了新的编程语言Swift.更高效更安全的口号再次吸引了一大批非iOS开发程序猿进入,小编觉得Swift代 ...
- swift 与 OC 混合编程
原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...
- Objective-C:swift、objective-c、C++、C混合编程
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- Swift和Objective-C混合编程——Swift调用OC
在iOS应用的开发中.Swift必将代替OC,两者的趋势是"短期共存,长期代替".但曾经有太多的代码是用OC语言完毕的,而Swift的开发也从 OC中继承了非常多的特性.两者也是有 ...
- Swift 与 C 语言混合编程
前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...
- Objective-C与Swift的混合编程
Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objecti ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
随机推荐
- ng-model 数据不更新 及 ng-repeat【ngRepeat:dupes】错误
一.ng-include 引入的文件中 ,ng-model 数据不更新 例如, $scope.username = “Jones” .此时,在 ng-include 引入的文件中,直接使用 ng-m ...
- 【Mac】小技巧:实现ssh服务器别名免密登录
前言 我们平常使用ssh user@host然后输入密码的方式来远程链接一个服务器,但是,如果要管理的服务器太多,记住这些服务器的IP和用户名.密码就是一个复杂的工作.当然,我们可以把这些信息用文档记 ...
- Codeforces 916C - Jamie and Interesting Graph
916C - Jamie and Interesting Graph 思路:构造. 对于1到n最短路且素数,那么1到n之间连2 对于最小生成树,找一个稍微大点的素数(比1e5大)构造一个和为这个素数的 ...
- typescripts学习
可选与默认参数 可选参数:在参数名后面,冒号前面添加一个问号,则表明该参数是可选的.如下代码: function buildName(firstName: string, lastName?: str ...
- AMD,CMD.CommonJs和UMD还有es6的模块化对比
CommonJS CommonJS是服务器端模块的规范,Node.js采用了这个规范. 根据CommonJS规范,一个单独的文件就是一个模块.加载模块使用require方法,该方法读取一个文件并执行, ...
- LeetCode--141--环形链表
问题描述: 给定一个链表,判断链表中是否有环. 思路:用快的指针追慢的指针,只要有圈,一定能追上. 错误: class Solution(object): def hasCycle(self, hea ...
- (转)理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow
转载自http://blog.51cto.com/benpaozhe/1767612: 一直对这个问题知其然而不知其所以然,这些日子再次碰到,看了很多的资料,彻底解决一下,呵呵,先上个图,所有理解围绕 ...
- Perfect Groups CodeForces - 980D
链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...
- UVA-10497 Sweet Child Makes Trouble (计数+高精度)
题目大意:这是一道简单排列组合题 .简单说下题意:n件物品,把这n件物品放到不是原来的位置,问所有的方案数.所有的位置都没有变. 题目解析:按照高中的方法,很快得到一个递推公式:f [n]= (n-1 ...
- OC 复合
在Objective-C中复合是通过包含作为实例变量的对象指针实现的 严格来说,只有对象间的组合才叫复合 --------------------Car.h---------------------- ...