@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);

@import url(/css/cuteeditor.css);

1 Objective-C调用C++

在Object-C程序有两种文件.m和.mm文件。

  • .m文件是Object-C文件,是完全兼容C语言,所以可以在.m文件中直接使用C语言的语法。
  • .mm文件是Object-C++文件,是完全兼容C++和C语言,所以可以在.mm文件中直接使用C++和C语言的语法。

所以当需要在Object-C中调用C++时,可以将.m文件直接重命名为.mm文件,这样就可以使用C++的语法和内容了。

如在main.mm文件:

1 #import <Foundation/Foundation.h> 
2 #import <iostream>         //这里不是用include C++的头文件,而是使用import 
3 int main(int argc, const char * argv[]) { 
4   @autoreleasepool { 
5      std::cout<<"hello CPP"<<std::endl; //完全是C++的语法 
6   } 
7   return 0; 
8 } 

2 Swift调用Objective-C

在Swift文件中要使用Object-C的内容,需要创建一个桥接头文件,通过桥接头文件实现Object-C语法到swift语法的转换,从而以swift的语法,在swift文件中调用Object-C的函数或类等内容。桥接头文件的命名规则是:<工程名>-swift.h。

若需要在Swift中调用Object-C可以按如下步骤操作:

  1. 新建Object-C格式的Cocoa Class文件,并在创建的过程中通过Xcode帮忙选择桥接头文件;
  2. 在桥接头文件中,import所需要使用Object-C的头文件;
  3. 在swift文件中,按Swift语法调用Object-C的内容。

如在swift环境中需要创建Object-C类的对象:

  • 在Object-C类文件:testObjectC.h声明为:
@interface testObjectC : NSObject 
-(NSString*)sayHello:(NSString*)greeting withName: (NSString*)name; 
@end 
  • 在桥接头文件的内容为:
#import "testObjectC.h"     //以Object-C的语法import相应的头文件,目前只需import一个文件  
  • 在swift文件的内容为 :
override func viewDidLoad() { 
super.viewDidLoad() 
// Do any additional setup after loading the view, typically from a nib. 
var obj : testObjectC = testObjectC(); //仍按swift语法调用Object—C的构造函数 
var hello = obj.sayHello("Good morning", withName:"Tony") 
}

3 Swift调用C

在swift文件中调用C语言,与在swift文件中使用Object-C类似,同样只需在桥接头文件import相应的头文件即可。

3.1 简单实例

如下是在Swift环境中调用C语言的函数:

  • 在C语言testC.h文件中的声明:
#include <stdio.h> 
void printC(int a); //在C语言头文件的声明,在testC.c文件中还有实现。 
  • 在桥接头文件的内容
#import "testC.h" //还是以Object-C语法import所需要的C语言头文件 
  • 在swift环境中调用
printC(2);        //直接以C语言的语法调用 

3.2 类型转换

由于swift和C两种语言的数据类型定义不完全相同,特别是在C语言中有指针的类型,而在swift中切没有,为了能够在swift环境中调用C语言的API函数,所以Apple在swift环境中定义了一些数据类型,从而能够以C语言的类型一一对应。

3.2.1 基本类型

如表 1所示是Swift环境中C语言调用API函数的数据类型映射表,即若要调用C语言的API,则需要定义表中左边的类型。

表 1

Swift Type

C Type

CBool

bool

Cchar

char, signed char

CUnsignedChar

unsigned char

Cshort

short

CUnsignedShort

unsigned short

CInt

int

CUnsignedInt

unsigned int

CLong

long

CUnsignedLong

unsigned long

CLongLong

long long

CUnsignedLongLong

unsigned long long

CWideChar

wchar_t

CChar16

char16_t

CChar32

char32_t

CFloat

float

CDouble

double

3.2.2 指针类型

由于在swift中没有指针类型,而C语言中存在指针。所以为了调用带有指针类型的C语言API,定义了表 2中swift指针类型。其中表 2中的Type是表 1中左边swift的基本类型,并且其可以用于返回值、变量和参数之间的转换。

表 2

Swift Syntax

C Syntax

UnsafePointer<Type>

const Type *

UnsafeMutablePointer<Type>

Type *

nil

NULL

COpaquePointer

T* (T表示非基本类型)

在C语言中的指针需要手动进行申请空间和释放空间,同样在swift语言中也需要手动进行操作;同时在C语言中还可使用"*"取得指针所在定址,而在Swift中若需要进行赋值和取值,则需要取用相应的方法。

表 3

Swift Syntax

C Syntax

description

static func alloc(num: Int) -> UnsafeMutablePointer<Memory>

Void *malloc(int )

申请定址空间

func dealloc(num: Int)

Void Free(void* )

释放地址空间

func initialize(newvalue: Memory)

*p = value

给指针所指的地址进行赋值

var memory: Memory { get nonmutating set }

Value = *p

取得地址上的值

&v

&v

取得变量的地址

比如在定义的C语言的函数对指针的值进行修改,通过在swift环境中取得指针的值:

  • C语言函数:
void testPoint(int* a) 

   printf("%d\n",*a); 
   *a = 44; 
}
  • swift环境调用

     1 override func viewDidLoad() 
     2 {     
     3     var sp:UnsafeMutablePointer<Int32> = UnsafeMutablePointer<Int32>.alloc(1); 
     4     sp.memory = 33;// 或者是:sp.initialize(33) 
     5     testPoint(sp); 
     6     print(sp.memory); 
     7     sp.dealloc(1); 
     8 } 
     9 
    10 
    11 输出:
    12      33
    13      44 

3.2.3 字符串

由于C语言的字符串可以简单分为两种:const和非const,所以swift与C语言之间的对应关系如所示。

表 4

Swift Syntax

C Syntax

UnsafeMutablePointer<CChar>

Char *

UnsafePointer

Const char*

虽然swift与C语言之间存在字符串的对应关系,但还需考虑UnsafeMutablePointer<CChar>或UnsafePointer<CChar>类型与swift语言的String字符串之间的转换。

  • StringàUnsafePointer<CChar>

要将swift语言的String字符串转换为C语言的UnsafePointer<CChar>或者是UnsafeMutablePointer<CChar>,需要Object-C的NSString作为转换中介。

图 1

  • UnsafePointer<CChar>àString

要将C语言的Unsafe Pointer<CChar>转换为swift语言的String,就不需要Object-C作为中介的,直接调用String类型的fromCString()函数就可以直接转换为Unsafe Pointer<CChar>。

图 2

  • C语言函数:

    void testString(char *str) 

       printf("C:%s\n",str); 
       strcpy(str,"world"); 
  • swift环境调用

     1 override func viewDidLoad() { 
     2      //声明swift、Object-C和C三种语言的字符串进 
     3      var ss:String = "hello"; 
     4      var os:NSString ; 
     5      var cs:UnsafeMutablePointer<CChar> = UnsafeMutablePointer<CChar>.alloc(1); 
     6      //将swift的字符串ss转换为object-C的字符串os,然后将object-C的字符串os转换为C语言的字符串cs 
     7      os = NSString.init(string:ss) 
     8      cs = UnsafeMutablePointer<CChar>(os.cStringUsingEncoding(1)) 
     9      testString(cs); //调用C语言的函数 
    10      ss = String.fromCString(cs)!; //将C语言的字符串cs直接转换为将swift的字符串ss 
    11      print("swift:"+ss); 
    12 }
  • 输出:

    C:hello 
    swift:world 

4 swift调用C++

目前无法直接调用,需要一些特别的技巧。若需要可以通过Object-C对C++进行包装,然后在swift中调用Object-C,既以swiftàObject-CàC++这样的顺序调用。

5 参考文献

  1. Apple:《Using swift with cocoa and Objective-C 》P174
  2. 书:《swift开发指南》P232;
  3. Apple:《Using Swift with Cocoa and Objective-C (Swift 2.1): Interacting with C APIs》

Objective-C:swift、objective-c、C++、C混合编程的更多相关文章

  1. Swift语言与Objective-C语言混合编程

    首先创建一个Swift的Single View工程 然后直接在工程中新建OC文件: 然后选择OC语言之后会问你是否自动创建OC和Swift的中间文件: 然后工程文件夹里就有了三个文件: 现在OC头文件 ...

  2. IOS-Swift、Objective-C、C++混合编程

    1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...

  3. Objective C & Swift & iOS & App

    Objective C & Swift & iOS & App https://www.runoob.com/ios/ios-objective-c.html https:// ...

  4. swift 与 OC 混合编程

    原文地址:http://www.cocoachina.com/swift/20150608/12025.html 一.解决问题 Swift项目需要使用封装好的Objective-c组件.第三方类库,苹 ...

  5. Swift 与 C 语言混合编程

    前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...

  6. Objective-C与Swift的混合编程

    Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objecti ...

  7. Swift和Objective-C混合编程——Swift调用OC

    在iOS应用的开发中.Swift必将代替OC,两者的趋势是"短期共存,长期代替".但曾经有太多的代码是用OC语言完毕的,而Swift的开发也从 OC中继承了非常多的特性.两者也是有 ...

  8. iOS自学-混合编程

    OC调用swift,引入头文件 #improt "工程名字-swift.h" swift调用OC,在桥梁文件里面引入OC文件 的头文件 尽情混合编程吧...

  9. iOS- Swift和Object-C的混合编程

    1.前言   事实证明,在短时间内Swift还取代不了Object-C, 而且.... Apple Swift 开发小组的人说的:「We'll recommend people start with ...

随机推荐

  1. jdbc 安装驱动

    在使用JDBC编程时需要连接数据库,导入JAR包是必须的,导入其它的jar包方法同样如此,导入的方法是 打开eclipse 1.右击要导入jar包的项目,点properties 2.左边选择java ...

  2. spring与mybatis,strut2整合连接sqlserver不的不说的那点事儿

    今天在通过spring与mybatis整合中,想连接下公司用的sqlserver数据库,结果使用Junit测发现没连上,于是就有了下面的问题: 准备工作都已经做好了 web中spring的监听配置了 ...

  3. iOS 宏定义_16进制色值转化为RGB返回UIColor类型对象

    // 十六进制颜色 #define COLOR_WITH_HEX(hexValue) [UIColor colorWithRed:((float)((hexValue & 0xFF0000) ...

  4. 【Maven】解决maven打jar包报错 source 1.3 中不支持注释 (请使用 -sour

    问题:maven在进行打包时,报 '请使用-source 5 或者更高版本以启用XX'的信息并导致打包失败. 原因:maven默认的编译插件的java版本较低,导致其不支持例如泛型,注解等用法. 解决 ...

  5. The Perfect Stall

    poj1274:http://poj.org/problem?id=1274 题意:有n个奶牛和m个谷仓,现在每个奶牛有自己喜欢去的谷仓,并且它们只会去自己喜欢的谷仓吃东西,问最多有多少奶牛能够吃到东 ...

  6. codeforces D. Multiplication Table

    http://codeforces.com/contest/448/problem/D 题意:一个n×m的矩阵,a[i][j]=i*j; 然后把a数组排序,找出第k个数. 思路:1-n×m二分枚举,然 ...

  7. Java语言基础(五) Java原始数据类型的分类以及数据范围

    Java原始数据类型的分类以及数据范围 1.基本数据类型分为:整型(byte, short, int, long),浮点型(float, double),字符型(char),布尔型(boolean) ...

  8. Say To ME

    每天都要有计划,无计划不生活. 计划包括天计划和月计划. 每个月应该有月主题. 避免大概,可能,貌似,等不肯定的词语.增强自信心,增强给别人的自信心. 不熬夜,早睡. 多运动,每周应该至少出门一次,运 ...

  9. HDU 5912 Fraction 【模拟】 (2016中国大学生程序设计竞赛(长春))

    Fraction Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  10. House Robber II——Leetcode

    After robbing those houses on that street, the thief has found himself a new place for his thievery ...