swift和 oc 混编2-备
在Swift语言出现之前,开发iOS或OS X应用主要使用Objective-C语言,此外还可以使用C和C++语言,但是UI部分只能使用Objective-C语言。
选择语言
Swift语言出现后,苹果公司给程序员提供了更多的选择,让这两种语言并存。既然是并存,我们就有4种方式可以选择:
采用纯Swift的改革派方式;
采用纯Objective-C的保守派方式;
采用Swift调用Objective-C的左倾改良派方式;
采用Objective-C调用Swift的右倾改良派方式。
文件扩展名
在Xcode等工具开发iOS或OS X应用可以编写多种形式的源文件,原本就可以使用Objective-C、C和C++语言,Swift语言出现后源文件的形式更加多样。可能的文件扩展名说明:
Swift与Objective-C API映射
在混合编程过程中Swift与Objective-C调用是双向的,由于不同语言对于相同API的表述是不同的,他们之间是有某种映射规律的,这种API映射规律主要体现在构造函数和方法两个方面。
1、构造函数映射
在Swift与Objective-C语言进行混合编程时,首先涉及到调用构造函数实例化对象问题,不同语言下构造函数表述形式不同,如图是苹果公司官方API文档,描述了NSString类的一个构造函数。
Swift构造函数除了第一个参数外,其它参数的外部名就是选择器对应部分名。规律的其它细节图中已经解释的很清楚了,这个规律反之亦然,这里不再赘述。
2、方法名映射
在Swift与Objective-C语言进行混合编程时,不同语言下方法名表述形式也是不同的,如图是苹果公司官方API文档,描述了NSString类的rangeOfString:options:range:方法。
选择器第一个部分rangeOfString作为方法名,一般情况下Swift方法第一个参数的外部参数名是要省略的,“_”符号表示省略。之后的选择器各部分名(如:options和range),作为外部参数名。除了参数名对应为,参数类型也要对应下来。
Swift 2.0之后方法可以声明抛出错误,这些能抛出错误的方法,不同语言下方法名表述形式如图下图所示,是writeToFile:atomically:encoding:error:苹果公司官方API文档。
比较两种不同语言,我们会发现error参数在Swift语言中不再使用,而是在方法后添加了throws关键字。
这种映射规律不仅仅只适用于苹果公司官方提供的Objective-C类,也适用于自己编写的Objective-C类。
如果引入必要的头文件,在Objective-C语言中可以使用C数据类型。而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言相对应数据类型。这些类型主要包括:C语言基本数据类型和指针类型。
C语言基本数据类型
如表所述是Swift数据类型与C语言基本数据类型对应关系表。
Swift语言中的这些数据类型与Swift原生的数据类型一样都,本质上都是结构体类型。我们可以他们的构造函数创建这些数据类型的实例。示例代码如下:
- var intSwift = 80
- //int
- var intNumber = NSNumber(int: CInt(intSwift))
- //unsigned char
- var unsignedCharNumber = NSNumber(unsignedChar: CUnsignedChar(intSwift))
- //unsigned int
- var unsignedIntNumber = NSNumber(unsignedInt: CUnsignedInt(intSwift))
变量intSwift所存储80是Int类型。代码中CInt(intSwift)是实例化CInt类型,它实现了将Int类型转化为C语言int类型,在Swift中使用CInt表示。
代码中CUnsignedChar(intSwift)是将Int类型转化为C语言unsigned char类型,在Swift中使用CUnsignedChar表示。
代码中的CUnsignedInt(intSwift))是将Int类型转化为C语言unsigned int类型,在Swift中使用CUnsignedInt表示。
C语言指针类型
如表所述是Swift数据类型与C语言指针数据类型对应关系表。
从表可见针对C语言多样的指针形式,Swift主要通过提供了三种不安全的泛型指针类型:UnsafePointer<T>、UnsafeMutablePointer<T>和AutoreleasingUnsafeMutablePointer<T>。T是泛型占位符,表示不同的数据类型。另外,还有COpaquePointer类型是Swift中无法表示的C指针类型。
下面我们分别介绍一下。
1.UnsafePointer<T>
UnsafePointer<T>是一个比较常用的常量指针类型,这种指针对象需要程序员自己手动管理内存,即需要自己申请和释放内存。它一般是由其他的指针创建。它的主要的构造函数有:
init(_ other: COpaquePointer)。通过COpaquePointer类型指针创建。
init<U>(_ from: UnsafeMutablePointer<U>)。通过UnsafeMutablePointer类型指针创建。
init<U>(_ from: UnsafePointer<U>)。通过UnsafePointer类型指针创建。
UnsafePointer<T>主要的属性:
memory。只读属性,它能够访问指针指向的内容。
UnsafePointer<T>主要的方法:
successor() -> UnsafePointer<T>。获得指针指向的下一个内存地址的内容。
predecessor() -> UnsafePointer<T>。获得指针指向的上一个内存地址的内容。
2. UnsafeMutablePointer<T>
UnsafeMutablePointer<T>是一个比较常用的可变指针类型,这种指针对象需要程序员自己手动管理内存,自己负责申请和释放内存。可变指针可以由其他的指针创建,也可以可变指针通过alloc(_:)方法申请内存空间,再调用initialize(_:)方法初始化指针指向数值。当指针对象释放时候需要调用destroy()方法销毁指针指向对象,它是initialize(_:)方法的反向操作,他们两个方法在代码中应该成对出现的。最后还要调用dealloc(_:)方法释放指针指向的内存空间,它是alloc(_:)方法的反向操作,这两个方法在代码中也应该成对出现。
3. AutoreleasingUnsafeMutablePointer<T>
AutoreleasingUnsafeMutablePointer<T>被称为自动释放指针,在方法或函数中声明为该类型的参数,是输入输出类型的,在调用方法或函数过程中,参数先首先被拷贝到一个无所有权的缓冲区,在方法或函数内使用的这个缓冲区,当方法或函数返回时,缓冲区数据重新写回到参数。
swift和 oc 混编2-备的更多相关文章
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...
- swift c++ oc 混编
http://www.tuicool.com/articles/QZNrErM iOS 里面 Swift与Objective-C混编,Swift与C++混编的一些比较 时间 2015-03-23 23 ...
- iOS8开发~Swift(五)Swift与OC混编
一.概要 首先看<The Swift Programming Language>中提到"Swift's compatibility with Objective-C lets y ...
- Swift与OC混编
OC调用Swift的方法:添加 import "xxxx-Swift.h" 头文件即可 Swift调用OC的方法:需要建立桥接: xxxx-Bridging-Header.h 头文 ...
- 在OC项目中实现swift与oc混编 相互引用
--------------------------------------------------------Begin--------------------------------------- ...
- Swift和OC 混编
1.首先创建一个Swift工程 2.导入或者创建一个OC文件(.h和.m) 3.再创建一个桥连接文件 4.然后文件样子为 5.在桥接链接里面导入头文件 6.通过targets->->bui ...
- swift与OC混编之调用函数
在桥接头文件里#import oc的.h文件,整个swift工程都能使用该oc文件,在.h里暴露的方法都能被该工程使用 //oc文件 TestOC.h #import @interface TestO ...
- swift与OC混编高级教程之混编框架的创建和调用
首先创建一个project取个名字叫“MyMixed”,选择iOS-framework&library-cocoa touch framework 然后在里面创建一个SwiftView.swi ...
- swift和oc混编
请参考这篇博客:点击查看
随机推荐
- LinGo:投资问题——线性规划
一.根据题目所给数据,建立一张表格方便查看 项目A 项目B 项目C 项目D 可投资年 1,2,3,4 3 2 1,2,3,4,5 收回本利年 次年年末 第5年 第5年 当年年末 本利 1.06 1.1 ...
- NSTemporaryDirectory 临时文件
唯一标识 : NSString*identifier=[[NSProcessInfoprocessInfo]globallyUniqueString]; 创建临时文件路径: NSString *fil ...
- 使用jquery生成二维码
二维码已经渗透到生活中的方方面面,不管到哪,我们都可以用扫一扫解决大多数问题.二狗为了准备应对以后项目中会出现的二维码任务,就上网了解了如何使用jquery.qrcode生成二维码.方法简单粗暴,[] ...
- 用shape结合selector实现点击效果
<span style="font-family:Arial, Helvetica, sans-serif;font-size:18px;background-color: rgb(2 ...
- how to get file from classpath using jboss7.x.1 --reference
question: I want to convert smooks xml-java, so that i need to load source file from mobeeadmin.war/ ...
- 关于DOS下启动MySQL时提示服务名无效
主要原因:启动时:net start mysql 而打开服务后发现,本地服务中mysql这个服务实际名字为mysql55,故启动语句应为:net start mysql55: 以下摘自课程提问: 你 ...
- Android自定义属性、控件三步法
第二步中layout-activity_main.xml 中自命名控件: xmlns:android="http://schemas.android.com/apk/res/android& ...
- yii [error] [exception.CHttpException.404] exception 'CHttpException' with message 'Unable to resolve the request "favicon.ico".'
yii使用中,发现runtime文件夹下出现这个错误信息 解决办法:在生成的APP程序根目录下建.htaccess文件(前提是需要开启apache重写,具体如何开,查资料咯) 然后配置如下 <I ...
- CSS3 字体
CSS3 @font-face 规则 在 CSS3 之前,web 设计师必须使用已在用户计算机上安装好的字体. 通过 CSS3,web 设计师可以使用他们喜欢的任意字体. 当您您找到或购买到希望使用的 ...
- curl 命令使用
1.开启gzip请求curl -I http://www.sina.com.cn/ -H Accept-Encoding:gzip,defalte 2.监控网页的响应时间curl -o /dev/nu ...