zoukankan      html  css  js  c++  java
  • 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语言出现后源文件的形式更加多样。可能的文件扩展名说明:

     

    SwiftObjective-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原生的数据类型一样都,本质上都是结构体类型。我们可以他们的构造函数创建这些数据类型的实例。示例代码如下:

     

     

    1. var intSwift = 80  
    2.   
    3.    
    4.   
    5. //int  
    6.   
    7. var intNumber  = NSNumber(int: CInt(intSwift))  
    8.   
    9.    
    10.   
    11. //unsigned char  
    12.   
    13. var unsignedCharNumber  = NSNumber(unsignedChar: CUnsignedChar(intSwift))  
    14.   
    15.    
    16.   
    17. //unsigned int  
    18.   
    19. 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>被称为自动释放指针,在方法或函数中声明为该类型的参数,是输入输出类型的,在调用方法或函数过程中,参数先首先被拷贝到一个无所有权的缓冲区,在方法或函数内使用的这个缓冲区,当方法或函数返回时,缓冲区数据重新写回到参数。

  • 相关阅读:
    angular2+ 使用ant.design 的 select组件时(nz-select)下拉框没有脱离文档流,直接撑开页面展示的问题
    element 获取table组件的下标
    调幅调频调相位
    Mongoose基于MongoDB建模并设置关联
    Xavier上TensorRT和Pytorch运行时间对比
    理解vue实例的生命周期和钩子函数
    [Vue]组件——.sync 修饰符实现对prop 进行“双向绑定”(子组件向父组件传值)
    vm.$attrs 【Vue 2.4.0新增inheritAttrs,attrs详解】
    (转)vue v-on修饰符
    Vue中的computed属性
  • 原文地址:https://www.cnblogs.com/isItOk/p/5454361.html
Copyright © 2011-2022 走看看