前言

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语言的混编就分享这么多,希望大神给出宝贵的意见!(@。ε。@)

转载于:https://www.cnblogs.com/tylerzhang/p/5978306.html

Swift和Objective-C混编注意事项相关推荐

  1. Swift和OC的混编(一)

    Swift和OC的混编(一) 由于最近swift版本趋于稳定的趋势,本人也一直在研究并尽可能的将swift用于现有的项目中,希望逐渐的替代之前的OC代码.废话不多说,直接上! 1.既然希望在OC中使用 ...

  2. OC与Swift混编 注意事项

    前言 随着Swift发展, 很多新的项目开始使用Swift作为首选语言. Swift语言以其简洁.快速.安全的特点获得了一大波粉丝,我也是其中之一. 项目背景:公司一些旧项目大都使用OC编写, 运营中 ...

  3. 从预编译的角度理解Swift与Objective-C及混编机制

    本文从预编译的基础知识入手,由浅至深的介绍了 Objective-C 和 Swift 的工作机制,并通过这些机制来解释混编项目中使用到的技术和各种参数的作用,由此来指导开发者如何进行混编. 写在前面 ...

  4. Swift和Objective-C混编

    Swift和Objective-C混编的注意啦 2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书 0  OCSwift混编 前言 Swift已推出数年,与O ...

  5. 【Swift】Swift和Objective-c混编

    1.介绍 Swift和Objective-C都是苹果公司的编程语言,它们可以在同一个项目中同时使用.这种混编方式被称为"混合编程"(Mixed Programming). 在混合编 ...

  6. oc语言和c语言,OC和C语言的混编注意点和好处

    苹果的Objective-C编译器批准用户在统一个源文件里自由地混杂利用C++和Objective-C,混编后的语言叫Objective-C++.有了它,你就能够在Objective-C利用过程中利用 ...

  7. Swift 与 Objective-C混编xxx-Swift.h File not found

    在iOS 开发中,由于苹果14年发布了Swift语言,具备简单实用.高效等诸多优点,越来越受开发者青睐.另外,由于Objective-C多年发展和稳定性,有很多框架(特别是商业SDK)采用Object ...

  8. 百度App Objective-C/Swift 组件化混编之路(一)

    作者丨郭金.陈佳 来源丨百度App技术 一. 背景 1.1 Swift 发展历史 2010 年 7 月,克里斯(Chris Lattner)开始设计 Swift.完成基础架构后,克里斯带领开发小组陆续 ...

  9. 百度App Objective-C/Swift 组件化混编之路(二)- 工程化

    作者丨张渝.郭金 来源丨百度App技术 前文<百度App Objective-C/Swift 组件化混编之路>已经介绍了百度App 引入 Swift 的影响面评估以及落地的实施步骤,本文主 ...

最新文章

  1. Android应用程序键盘(Keyboard)消息处理机制分析(17)
  2. emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
  3. 软件测试作业3:软件测试的16条公理
  4. GHOST内部错误 36000(internal error 36000)情况的解决办法
  5. TensorRT安装教程
  6. 史上最好记的神经网络结构速记表(上)
  7. LeetCode 285. 二叉搜索树中的顺序后继(中序遍历)
  8. php内核一 一次请求与结束
  9. 别用Excel做数据可视化了!这款报表工具不比它香100倍?
  10. 写帮助大家学习的小框架
  11. Windows Mobile 6中禁用键盘或者是禁用某些按键(C#)
  12. mysql时间间隔年份_MySQL DATEDIFF函数获取两个日期的时间间隔的方法
  13. EXCLE调用REFPROP操作以及问题
  14. 华硕升级bios的问题
  15. 如何通过QQ机器人技术实现禅道bug的自动提交功能
  16. SEAIR传染病模型及其开源代码
  17. 在线教育开源源码:线上教育如今各种“陷阱营销”,应如何规避?
  18. HTML 按钮交互,20 个交互非常棒的按钮代码_html/css_WEB-ITnose
  19. 十年远景书计算机应用,写一篇十年愿景书
  20. chipsel语言_英语快速记忆法视频

热门文章

  1. JavaScript的基本语法
  2. 自定义Excel下拉菜单
  3. The Eclipse JDT Core jar is not in the classpath
  4. 在ArcGIS调坐标系引发的一系列问题
  5. mock 测试 MVC
  6. UVa 1609 (博弈) Foul Play
  7. Hibernate中的inverse属性和cascade属性
  8. Android GestureDetector方法详解
  9. android圆形进度条ProgressBar颜色设置
  10. gradle项目打war和jar包