Swift和Objective-C混编的注意啦

2016-10-19 13:29 编辑: 不灭的小灯灯 分类:iOS开发 来源:仁伯安的简书

OCSwift混编

前言

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

转载于:https://www.cnblogs.com/ruixin-jia/p/5983366.html

Swift和Objective-C混编相关推荐

  1. Swift和OC的混编(一)

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

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

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

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

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

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

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

  5. Swift和Objective-C混编注意事项

    前言 Swift已推出数年,与Objective-C相比Swift的语言机制及使用简易程度上更接地气,大大降低了iOS入门门槛.当然这对新入行的童鞋没来讲,的确算是福音,但对于整个iOS编程从业者来讲 ...

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

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

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

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

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

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

  9. 初探swift语言的学习笔记九(OC与Swift混编)

    作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...

最新文章

  1. UA MATH567 高维统计I 概率不等式11 Azuma不等式
  2. 【NOIP考前模拟赛】纯数学方法推导——旅行者问题
  3. 聚焦openEuler Summit,解锁云原生、开源等领域的实践干货
  4. 基于聚类和神经网络的图像颜色提取和评分方案
  5. Springsecurity之认证过程简析
  6. 命令行 – 为什么pssh命令不起作用?
  7. 坚持写博客,果然有人找吾进行技术合作
  8. 选股公式 成功率测试 软件,通达信股票软件选股公式,99%的成功率,你还等什么?...
  9. ISO27145协议解析
  10. 两台服务器安装redis集群_两台服务器六节点redis集群环境搭建
  11. mac系统调节鼠标、触控板灵敏度
  12. 倾斜模型精细化处理_基于倾斜摄影三维建模的模型精细化修复方法研究
  13. 软件工程(速成)——第四章 总体设计
  14. 33暴力破解(MD5撞击)
  15. 45本程序员圣经级别书籍,包邮送到家
  16. Karl Guttag:从AWE 2022光学技术展示看未来AR趋势
  17. 哥大sps学院有计算机,哥大的sps学院是什么意思
  18. Codeforces 题目合集+分类+代码 【Updating...】【361 in total】
  19. Web Player TcPlayer
  20. 百度云管家不用客户端下载大文件

热门文章

  1. 基于vue2.0实现音乐/视频播放进度条组件的思路及具体实现方法+代码解释
  2. 本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵
  3. FCN Caffe:可视化featureMaps和Weights(C++)、获取FCN结果
  4. OpenCV:OpenCV目标检测Adaboost+haar源代码分析
  5. OpenCv:椭圆上点的计算方程
  6. 对现代C++的一点看法
  7. JavaScript继承
  8. python处理进度条
  9. Dell R710服务器磁盘恢复数据库一例(记录)
  10. tilecache2.11在windows apache2.22安装部署