当前位置:文档之家› Swift和C语言混合编程教程解析

Swift和C语言混合编程教程解析

Swift和C语言混合编程教程这篇文章主要介绍了Swift和C语言混合编程教程,介绍基本数据类型对比、指针、常量等内容,需要的朋友可以参考下作为一种可与Objective-C 相互调用的语言,Swift 也具有一些与C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的C 代码结构混合编程的编程方式。

基本数据类型Swift 提供了一些和C 语言的基本类型如char,int,float,double等价的Swift 基本数据类型。

然而,这些Swift 的核心基本类型之间并不能隐式的相互转换,如Int。

因此,只有你的代码明确要求它们时再使用这些类型,而Int 可以在任何你想使用它的时候使用。

C 类型Swift 类型boolCBoolchar, signed charCCharunsigned charCUnsignedCharshortCShortunsigned short CUnsignedShortintCIntunsigned int CUnsignedIntlongCLongunsigned long CUnsignedLonglong long CLongLongunsigned long long CUnsignedLongLongwchar_tCWideCharchar16_tCChar16char32_tCChar32floatCFloatdoubleCDouble枚举Swift 引进了用宏NS_ENUM来标记的任何C 风格的枚举类型。

这意味着无论枚举值是在系统框架还是在自定义的代码中定义的,当他们导入到Swift 时,他们的前缀名称将被截断。

例如,看这个Objective-C 枚举:复制代码代码如下://Objective-Ctypedef NS_ENUM(NSInteger, UITableViewCellStyle) {UITableViewCellStyleDefault,UITableViewCellStyleValue1,UITableViewCellStyleValue2,UITableViewCellStyleSubtitle};在Swift 中这样来实现:复制代码代码如下://Swiftenum UITableViewCellStyle: Int {case Defaultcase Value1case Value2case Subtitle}当您需要指向一个枚举值时,使用以点(.)开头的枚举名称:复制代码代码如下://Swiftlet cellStyle: UITableViewCellStyle = .DefaultSwift 也引进了标有NS_OPTIONS宏选项。

而选项的行为类似于引进的枚举,选项还可以支持一些位操作,如&,| 和~。

在Objective-C 中,你用一个空的选项设置标示恒为零(0)。

在Swift 中,使用nil代表没有任何选项。

指针Swift 尽可能避免让您直接访问指针。

然而,当您需要直接操作内存的时候,Swift 也为您提供了多种指针类型。

下面的表使用Type 作为占位符类型名称来表示语法的映射。

对于参数,使用以下映射:C 句法Swift 句法const void *CConstVoidPointervoid *CMutableVoidPointerconst Type *CConstPointer<Type>Type *CMutablePointer<Type>对于返回类型,变量和参数类型的多层次指针,使用以下映射:C 句法Swift 句法void *COpaquePointerType *UnsafePointer<Type>对于类(class)类型,使用以下映射:C 句法Swift 句法Type * const *CConstPointer<Type>Type * __strong *CMutablePointer<Type>Type **AutoreleasingUnsafePointer<Type>C 可变指针当一个函数被声明为接受CMutablePointer<Type>参数时,这个函数可以接受下列任何一个类型作为参数:•nil,作为空指针传入•一个CMutablePointer<Type>类型的值•一个操作数是Type 类型的左值的输入输出表达式,作为这个左值的内存地址传入•一个输入输出Type[] 值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长如果您像这样声明了一个函数:复制代码代码如下://Swiftfunc takesAMutablePointer(x: CMutablePointer<Float>) { /*...*/ }那么您可以使用以下任何一种方式来调用这个函数:复制代码代码如下://Swiftvar x: Float = 0.0var p: CMutablePointer<Float> = nilvar a: Float[] = [1.0, 2.0, 3.0]takesAMutablePointer(nil)takesAMutablePointer(p)takesAMutablePointer(&x)takesAMutablePointer(&a)当函数被声明使用一个CMutableVoidPointer参数,那么这个函数接受任何和CMutablePointer<Type>相似类型的Type操作数。

如果您这样定义了一个函数:复制代码代码如下://Swiftfunc takesAMutableVoidPointer(x: CMutableVoidPointer) { /* ... */ }那么您可以使用以下任何一种方式来调用这个函数:复制代码代码如下://Swiftvar x: Float = 0.0, y: Int = 0var p: CMutablePointer<Float> = nil, q: CMutablePointer<Int> = nilvar a: Float[] = [1.0, 2.0, 3.0], b: Int = [1, 2, 3]takesAMutableVoidPointer(nil)takesAMutableVoidPointer(p)takesAMutableVoidPointer(q)takesAMutableVoidPointer(&x)takesAMutableVoidPointer(&y)takesAMutableVoidPointer(&a)takesAMutableVoidPointer(&b)C 常指针当一个函数被声明为接受CConstPointer<Type>参数时,这个函数可以接受下列任何一个类型作为参数:•nil,作为空指针传入•一个CMutablePointer<Type>, CMutableVoidPointer, Pointer<Type>, CConstVoidPointer, 或者在必要情况下转换成CConstPointer<Type>的AutoreleasingUnsafePointer<Type>值•一个操作数是Type 类型的左值的输入输出表达式,作为这个左值的内存地址传入•一个Type[]数组值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长复制代码代码如下://Swiftfunc takesAConstPointer(x: CConstPointer<Float>) { /*...*/ }那么您可以使用以下任何一种方式来调用这个函数:复制代码代码如下://Swiftvar x: Float = 0.0var p: CConstPointer<Float> = niltakesAConstPointer(nil)takesAConstPointer(p)takesAConstPointer(&x)takesAConstPointer([1.0, 2.0, 3.0])当函数被声明使用一个CConstVoidPointer参数,那么这个函数接受任何和CConstPointer<Type> 相似类型的Type操作数。

如果您这样定义了一个函数:复制代码代码如下://Swift func takesAConstVoidPointer(x: CConstVoidPointer) { /* ... */ }那么您可以使用以下任何一种方式来调用这个函数:复制代码代码如下://Swiftvar x: Float = 0.0, y: Int = 0var p: CConstPointer<Float> = nil, q: CConstPointer<Int> = niltakesAConstVoidPointer(nil)takesAConstVoidPointer(p)takesAConstVoidPointer(q)takesAConstVoidPointer(&x)takesAConstVoidPointer(&y)takesAConstVoidPointer([1.0, 2.0, 3.0])takesAConstVoidPointer([1, 2, 3])自动释放不安全指针当一个函数被声明为接受AutoreleasingUnsafePointer<Type>参数时,这个函数可以接受下列任何一个类型作为参数:•nil,作为空指针传入•一个AutoreleasingUnsafePointer<Type>值•其操作数是原始的,复制到一个临时的没有所有者的缓冲区的一个输入输出表达式,该缓冲区的地址传递给调用,并返回时,缓冲区中的值加载,保存,并重新分配到操作数。

注意:这个列表没有包含数组。

如果您这样定义了一个函数:复制代码代码如下://Swiftfunc Pointer(x: AutoreleasingUnsafePointer<NSDate?>) { /* ... */ }那么您可以使用以下任何一种方式来调用这个函数:复制代码代码如下://Swiftvar x: NSDate? = nilvar p: AutoreleasingUnsafePointer<NSDate?> = niltakesAnAutoreleasingPointer(nil)takesAnAutoreleasingPointer(p)takesAnAutoreleasingPointer(&x)注意:C 语言函数指针没有被Swift 引进。

相关主题