Swift和C语言混合编程教程
作为一种可与Objective-C相互调用的语言,Swift也具有一些与C语言的类型和特性,如果你的代码有需要,Swift也提供了和常见的C代码结构混合编程的编程方式。
基本数据类型
Swift提供了一些和C语言的基本类型如char,int,float,double等价的Swift基本数据类型。然而,这些Swift的核心基本类型之间并不能隐式的相互转换,如Int。因此,只有你的代码明确要求它们时再使用这些类型,而Int可以在任何你想使用它的时候使用。
C类型
Swift类型
bool
CBool
char,signedchar
CChar
unsignedchar
CUnsignedChar
short
CShort
unsignedshort
CUnsignedShort
int
CInt
unsignedint
CUnsignedInt
long
CLong
unsignedlong
CUnsignedLong
longlong
CLongLong
unsignedlonglong
CUnsignedLongLong
wchar_t
CWideChar
char16_t
CChar16
char32_t
CChar32
float
CFloat
double
CDouble
枚举
Swift引进了用宏NS_ENUM来标记的任何C风格的枚举类型。这意味着无论枚举值是在系统框架还是在自定义的代码中定义的,当他们导入到Swift时,他们的前缀名称将被截断。例如,看这个Objective-C枚举:
//Objective-C typedefNS_ENUM(NSInteger,UITableViewCellStyle){ UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle };
在Swift中这样来实现:
//Swift enumUITableViewCellStyle:Int{ caseDefault caseValue1 caseValue2 caseSubtitle }
当您需要指向一个枚举值时,使用以点(.)开头的枚举名称:
//Swift letcellStyle:UITableViewCellStyle=.Default
Swift也引进了标有NS_OPTIONS宏选项。而选项的行为类似于引进的枚举,选项还可以支持一些位操作,如&,|和~。在Objective-C中,你用一个空的选项设置标示恒为零(0)。在Swift中,使用nil代表没有任何选项。
指针
Swift尽可能避免让您直接访问指针。然而,当您需要直接操作内存的时候,Swift也为您提供了多种指针类型。下面的表使用Type作为占位符类型名称来表示语法的映射。
对于参数,使用以下映射:
C句法
Swift句法
constvoid*
CConstVoidPointer
void*
CMutableVoidPointer
constType*
CConstPointer<Type>
Type*
CMutablePointer<Type>
对于返回类型,变量和参数类型的多层次指针,使用以下映射:
C句法
Swift句法
void*
COpaquePointer
Type*
UnsafePointer<Type>
对于类(class)类型,使用以下映射:
C句法
Swift句法
Type*const*
CConstPointer<Type>
Type*__strong*
CMutablePointer<Type>
Type**
AutoreleasingUnsafePointer<Type>
C可变指针
当一个函数被声明为接受CMutablePointer<Type>参数时,这个函数可以接受下列任何一个类型作为参数:
•nil,作为空指针传入
•一个CMutablePointer<Type>类型的值
•一个操作数是Type类型的左值的输入输出表达式,作为这个左值的内存地址传入
•一个输入输出Type[]值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长
如果您像这样声明了一个函数:
//Swift functakesAMutablePointer(x:CMutablePointer<Float>){/*...*/}
那么您可以使用以下任何一种方式来调用这个函数:
//Swift varx:Float=0.0 varp:CMutablePointer<Float>=nil vara:Float[]=[1.0,2.0,3.0]
takesAMutablePointer(nil) takesAMutablePointer(p) takesAMutablePointer(&x) takesAMutablePointer(&a)