Swift和C语言混合编程教程解析.docx
- 文档编号:26178223
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:13
- 大小:17.85KB
Swift和C语言混合编程教程解析.docx
《Swift和C语言混合编程教程解析.docx》由会员分享,可在线阅读,更多相关《Swift和C语言混合编程教程解析.docx(13页珍藏版)》请在冰豆网上搜索。
Swift和C语言混合编程教程解析
Swift和C语言混合编程教程
这篇文章主要介绍了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*
CMutablePointer
对于返回类型,变量和参数类型的多层次指针,使用以下映射:
C句法
Swift句法
void*
COpaquePointer
Type*
UnsafePointer
对于类(class)类型,使用以下映射:
C句法
Swift句法
Type*const*
CConstPointer
Type*__strong*
CMutablePointer
Type**
AutoreleasingUnsafePointer
C可变指针
当一个函数被声明为接受CMutablePointer
•nil,作为空指针传入
•一个CMutablePointer
•一个操作数是Type类型的左值的输入输出表达式,作为这个左值的内存地址传入
•一个输入输出Type[]值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长
如果您像这样声明了一个函数:
复制代码代码如下:
//Swift
functakesAMutablePointer(x:
CMutablePointer
那么您可以使用以下任何一种方式来调用这个函数:
复制代码代码如下:
//Swift
varx:
Float=0.0
varp:
CMutablePointer
vara:
Float[]=[1.0,2.0,3.0]
takesAMutablePointer(nil)
takesAMutablePointer(p)
takesAMutablePointer(&x)
takesAMutablePointer(&a)
当函数被声明使用一个CMutableVoidPointer参数,那么这个函数接受任何和CMutablePointer
如果您这样定义了一个函数:
复制代码代码如下:
//Swift
functakesAMutableVoidPointer(x:
CMutableVoidPointer){/*...*/}
那么您可以使用以下任何一种方式来调用这个函数:
复制代码代码如下:
//Swift
varx:
Float=0.0,y:
Int=0
varp:
CMutablePointer
CMutablePointer
vara:
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
•nil,作为空指针传入
•一个CMutablePointer
•一个操作数是Type类型的左值的输入输出表达式,作为这个左值的内存地址传入
•一个Type[]数组值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长
复制代码代码如下:
//Swift
functakesAConstPointer(x:
CConstPointer
那么您可以使用以下任何一种方式来调用这个函数:
复制代码代码如下:
//Swift
varx:
Float=0.0
varp:
CConstPointer
takesAConstPointer(nil)
takesAConstPointer(p)
takesAConstPointer(&x)
takesAConstPointer([1.0,2.0,3.0])
当函数被声明使用一个CConstVoidPointer参数,那么这个函数接受任何和CConstPointer
如果您这样定义了一个函数:
复制代码代码如下:
//Swift
functakesAConstVoidPointer(x:
CConstVoidPointer){/*...*/}
那么您可以使用以下任何一种方式来调用这个函数:
复制代码代码如下:
//Swift
varx:
Float=0.0,y:
Int=0
varp:
CConstPointer
CConstPointer
takesAConstVoidPointer(nil)
takesAConstVoidPointer(p)
takesAConstVoidPointer(q)
takesAConstVoidPointer(&x)
takesAConstVoidPointer(&y)
takesAConstVoidPointer([1.0,2.0,3.0])
takesAConstVoidPointer([1,2,3])
自动释放不安全指针
当一个函数被声明为接受AutoreleasingUnsafePointer
•nil,作为空指针传入
•一个AutoreleasingUnsafePointer
•其操作数是原始的,复制到一个临时的没有所有者的缓冲区的一个输入输出表达式,该缓冲区的地址传递给调用,并返回时,缓冲区中的值加载,保存,并重新分配到操作数。
注意:
这个列表没有包含数组。
如果您这样定义了一个函数:
复制代码代码如下:
//Swift
functakesAnAPointer(x:
AutoreleasingUnsafePointer >){/*...*/} 那么您可以使用以下任何一种方式来调用这个函数: 复制代码代码如下: //Swift varx: NSDate? =nil varp: AutoreleasingUnsafePointer >=nil  takesAnAutoreleasingPointer(nil) takesAnAutoreleasingPointer(p) takesAnAutoreleasingPointer(&x) 注意: C语言函数指针没有被Swift引进。 全局常量 在C和Objective-C语言源文件中定义的全局常量会自动地被Swift编译引进并做为Swift的全局常量。 预处理指令 Swift编译器不包含预处理器。 取而代之的是,它充分利用了编译时属性,生成配置,和语言特性来完成相同的功能。 因此,Swift没有引进预处理指令。 简单宏 在C和Objective-C,您通常使用的#define指令定义的一个宏常数,在Swift,您可以使用全局常量来代替。 例如: 一个全局定义#defineFADE_ANIMATION_DURATION0.35,在Swift可以使用letFADE_ANIMATION_DURATION=0.35来更好的表述。 由于简单的用于定义常量的宏会被直接被映射成Swift全局量,Swift编译器会自动引进在C或Objective-C源文件中定义的简单宏。 复杂宏 在C和Objective-C中使用的复杂宏在Swift中并没有与之对应的定义。 复杂宏是那些不用来定义常量的宏,而是用来定义包含小括号(),函数的宏。 您在C和Objective-C使用复杂的宏是用来避免类型检查的限制和相同代码的重复劳动。 然而,宏也会产生Bug和重构的困难。 在Swift中你可以直接使用函数和泛型来达到同样的效果。 因此,在C和Objective-C源文件中定义的复杂宏在Swift是不能使用的。 编译配置 Swift代码和Objective-C代码以不同的方式进行条件编译。 Swift代码可以根据生成配置的评价配进行有条件的编译。 生成配置包括true和false字面值,命令行标志,和下表中的平台测试函数。 您可以使用-D<#Flag#>指定命令行标志。 函数 有效参数 os() OSX,iOS arch() x86_64,arm,arm64,i386 注意: arch(arm)的生成配置不会为64位arm设备返回true,当代码运行在为32位的ios模拟器器时,arch(i386)的生成配置返回true。 一个简单的条件编译需要以下代码格式: 复制代码代码如下: #ifbuildconfiguration statements #else statements #endif 一个由零个或多个有效的Swift语句声明的statements,可以包括表达式,语句和控制流语句。 您可以添加额外的构建配置要求,条件编译说明用&&和||操作符以及! 操作符,添加条件控制块用#elseif: 复制代码代码如下: #ifbuildconfiguration&&! buildconfiguration statements #elseifbuildconfiguration statements #else statements #endif 与C语言编译器的条件编译相反,Swift条件编译语句必须完全是自包含和语法有效的代码块。 这是因为Swift代码即使没有被编译,也要全部进行语法检查。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Swift 语言 混合 编程 教程 解析