Swift和Objective-C混编的注意啦
文/仁伯安(授权)
原文链接:http://www.jianshu.com/p/2ed48b954612
前言
Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛。当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲,真真是,曾几何时“高大上”,转瞬之间“矮矬穷”。再加上培训班横行,批量批发之下,iOS再也看不到当年的辉煌。
往事不再提,事还是要做滴。iOS10推出后,紧跟着Xcode8也推送了更新,细心者会发现,Xcode8下iOS版本最低适配已变为iOS8.0,加上Swift版本趋于稳定,从某种意义上讲,Swift的时代正式开启,替代Objective-C怕也只是时间问题。当然,在这之前,我们也应做好准备。今年越来的越多的公司,也开始了Swift和Objective-C混编。
我们今天就来看看两者混编中的一些注意事项及问题:
混编
混编也无非两种情况,
在Objective - C工程或者文件使用Swift的文件;
在Swift工程或者文件使用Objective - C文件
在混编的过程中最重要的两个文件:
1.桥接文件:
桥接文件“ProjectName-Bridging-Header.h”,在首次创建其他文件的时候,会自动生成。如果不小心删除后,也可以手动添加,不过名字必须是“ProjectName-Bridging-Header.h”头文件(名称组成:工程名-Bridging-Header.h),如果名字记不清也可以自己新建Header file后,在Targets→Build Settings→Swift Compiler - General→Objective-C Bridging Header配置文件路径,这个文件主要是Swift使用OC类时使用。
2.Objective-C Generated Interface Header Name文件
这个文件是混编时,系统生成的Swift文件对应的Objective-C的头文件,具体可以在Targets→Build Settings→Swift Compiler - General→Objective-C Generated Interface Header Name进行配置,默认文件名是工程名-Swift.h,一般不做改动。
在Objective - C工程或者文件使用Swift的文件
当在OC文件中调用Swift文件中的类的时候,首先在OC文件中要加上 #import “
ProjectName-swift.h”(名字组成:工程名-swift)
这个文件虽然在工程中看不到,但是她真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码。
引入后,具体类的使用,直接按照OC的方式使用即可。
在Swift工程或者文件使用Objective - C文件
当在Swift中使用OC文件的时候,只需在桥接文件即projectName-Bridging-Header.h文件中引入需要的头文件。
具体使用,按照对应的Swift语法结构来即可。
混编注意事项
对于需要混编的Swift类添加@objc声明或继承NSObject或NSObject的子类
class TestClass
{
// 属性
// 实现
}
如果要在Objective-C类中使用TestClass类,应当使用@objc加以声明,或者将TestClass继承自NSObject或NSObject的子类,否则,引入ProductName-Swift.h之后,程序找不到对应类。
使用第三方Framework
设置: target-->build setting -->Packaging -->Defines Module为 “Yes”;
然后,配置文件Target -> Build Phases -> Link Binary,添加要导入的Framework;
最后,还是要配置桥接文件,比如要使用 abc-lib.framework库中的 abc.h 就要这样配置:#import"abc-lib/abc.h";
Subclass子类问题
对于自定义的类而言,Objective-C的类,不能继承自Swift的类,即要混编的OC类不能是Swift类的子类。反过来,需要混编的Swift类可以继承自OC的类。 注解
OC宏文件
如Swift文件要使用OC中定义的宏,只能使用常量简单宏文件。
Swift独有特性
Swift中有许多OC没有的特性,比如,Swift有元组、为一等公民的函数、还有特有的枚举类型。所以,要使用的混编文件要注意Swift独有属性问题。
案例之Swift中使用OC的block
Swift中使用Closure不能使用Block作为属性进行传值,必须是初始化方法或函数。
Objective-C文件中:
#import <UIKit/UIKit.h>
typedef void (^Myblock)(NSString *arg);
@interface FirViewController : UIViewController
//@property (copy, nonatomic) Myblock myBlock;
//这种作为公共参数的形式,如果在Swift类中去回调的话,是有问题的。提示没有初始化方法,所以使用下面的以Block为参数的方法
- (void)transValue:(Myblock) block;
@end
下面是.m文件
#import "FirViewController.h"
@implementation FirViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
- (void)transValue:(Myblock)block
{
if (block)
{
block(@"firBack");
}
}
@end
在Swift文件回调:
在Swift使用OC的类时,首先在桥接文件中声明oc的头文件
工程名-Bridging-Header.h这是创建Swift工程的情况下
import UIKit
class ViewController: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
}
@IBOutlet weak var goFirst: UIButton!
@IBAction func goFirstAction(sender: AnyObject)
{
let firVC:FirViewController = FirViewController()
firVC. transValue { ( arg:String !) -> Void in
self.aBtn?.setTitle(arg, forState: UIControlState.Normal)
}
self.navigationController?.pushViewController(firVC, animated: true)
}
Swift和Objective-C混编的注意啦的更多相关文章
- Swift _ OC _ 混编
Swift _ OC _ 混编 在OC环境下使用Swift. GitHub源码
- 详解Swift和OC的混编
前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...
- iOS开发--Swift 如何完成工程中Swift和OC的混编桥接(Cocoapods同样适用)
由于SDK现在大部分都是OC版本, 所以假如你是一名主要以Swift语言进行开发的开发者, 就要面临如何让OC和Swift兼容在一个工程中, 如果你没有进行过这样的操作, 会感觉异常的茫然, 不用担心 ...
- swift和oc的混编
一.Swift工程中加入oc代码 1.在将oc代码加入到Swift工程的时候Xcode会自动创建一个桥接文件“yourProgectName-Bridging-Header.h”,如果没有创建或者删除 ...
- 开发 Swift 和 Objective-C 混编的 Framework
来源:黄文臣 blog.csdn.net/hello_hwc/article/details/58320433 前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C ...
- obeject-c 与 swift 混编
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...
- swift实现与OC的混编
swift与OC的混编 现在写swift,很多的类库还不是很全,很多的第三方还是只有OC版的,这个时候swift想用,通常都是采用的swift和OC混编的方式.这里给大家演示一下混编是如何做的. sw ...
- 详解 swift2.2 和 OC 的混编
前言: 我们在一些情况下,仅仅使用swift 是无法完成一个项目的,在swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项 ...
- iOS开发——技术精华Swift篇&Swift 2.0和Objective-C2.0混编之第三方框架的使用
swift 语言是苹果公司在2014年的WWDC大会上发布的全新的编程语言.Swift语言继承了C语言以及Objective-C的特性,且克服了C语言的兼容性问题.Swift语言采用安全编程模式,且引 ...
- Swift和Objective-C混编注意事项
前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...
随机推荐
- 非常优秀的iphone学习文章总结!
This site contains a ton of fun tutorials – so many that they were becoming hard to find! So I put t ...
- codeforces 560 C Gerald's Hexagon
神精度--------这都能过.随便算就好了,根本不用操心 就是把六边形补全成三角形.然后去掉补的三个三角形,然后面积除以边长1的三角形的面积就可以.... #include<map> # ...
- Objective-C:NSNumber类的常见用法
NSNumber基本数据类型包装类: // // main.m // 04-NSNumber // // Created by ma c on 15/8/17. // Copyright (c ...
- [4] 圆锥(Cone)图形的生成算法
顶点数据的生成 bool YfBuildConeVertices ( Yreal radius, Yreal height, Yuint slices, YeOriginPose originPose ...
- 《House of Cards》观后感
<House of Cards>,首先我得说好看,36个赞,比我以前看的那些美剧都要好看,虽然我是个屌丝程序员,但是我还是希望我自己看书不只看专业的书那种,虽然我是个屌丝程序员,工科男,所 ...
- [Functional Programming] Fst & Snd, Code interview question
cons(a, b) constructs a pair, and car(pair) and cdr(pair) returns the first and last element of that ...
- Java 程序内存分析
转自:http://www.iteye.com/topic/528230 java程序内存主要分为了2个部分,包括stack segment(栈内存区).heap segment(堆内存区). 在分析 ...
- iOS单元測试:Specta + Expecta + OCMock + OHHTTPStubs + KIF
框架选择 參考这篇选型文章,http://zixun.github.io/blog/2015/04/11/iosdan-yuan-ce-shi-xi-lie-dan-yuan-ce-shi-kuang ...
- procedure
create or replace procedure get_username as begin v_id in number:=1 select * from uc_t_staff t where ...
- C#.NET常见问题(FAQ)-如何引用定义好的dll文件
1 添加引用,找到dll文件 2 引用类的名称空间,生成类的实例,调用类的方法,测试OK. 更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...