作为与Objective-C语言的互操作性的一部分,Swift也保持了一些与C语言的类型和功能的兼容性,如果你的代码有需要,Swift还提供了使用常见的C结构和模式的方式,如果你的代码需要的话。

基本数据类型

Swift提供了一些等同于C语言基本类型,如char、int、float和double等。然而,这些类型和Swift核心基本类型之间没有隐式转换,如Int。因此,只有你的代码明确要求它们时再使用这些类型,而Int可以在任何你想使用它的时候使用。

枚举

Swift引进了Swift枚举标作为任何用宏NS_ENUM来标记的C风格的枚举。这意味着无论枚举值是在系统框架还是在自定义的代码中定义的,当他们导入到Swift时,他们的前缀名称将被截断。例如,看这个Objective-C枚举:

 
  1. //Objective-C
  2. typedef NS_ENUM(NSInteger,UITableViewCellStyle) {
  3. UITableViewCellStyleDefault,
  4. UITableViewCellStyleValue1,
  5. UITableViewCellStyleValue2,
  6. UITableViewCellStyleSubtitle
  7. };

在Swift中这样来使用:

 
  1. //Swift
  2. enum UITableViewCellStyle: Int {
  3. case Default
  4. case Value1
  5. case Value2
  6. case Subtitle
  7. }

当您需要指向一个枚举值时,使用以点(.)开头的枚举名称:

 
  1. //Swift
  2. let cellStyle: UITableViewCellStyle = .Default

Swift也引进了标有NS_OPTIONS宏选项。而选项的行为类似于引进的枚举,选项还可以支持一些位操作,如&,|以及?。在Objective-C中,你用一个空的选项设置标示恒为零(0)。在Swift中,使用nil代表没有任何选项。

指针

只要可能,Swift尽可能避免让您直接访问指针。然而,当您需要直接操作内存的时候,Swift也为您提供了多种指针类型。下面的表使用Type作为占位符类型名称来表示语法的映射。

对于参数,以下映射适用:

对于返回类型,变量和参数类型的多层次指针,以下映射应用:

对于类(class)类型,以下映射适用:

C 可变指针

当一个函数被声明为接受CMutablePointer参数时,这个函数可以接受下列任何一个类型作为参数:

1.nil,作为空指针传入。

2.一个CMutablePointer值。

3.一个操作数是Type类型的左值的 in-out 表达式,作为这个左值的内存地址传入。

4.一个in-out Type[]值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长。

如果您像这样声明了一个函数:

 
  1. //Swift
  2. func takesAMutablePointer(x: CMutablePointer) { /*...*/ }

那么您可以使用以下任何一种方式来调用这个函数:

 
  1. //Swift
  2. var x: Float = 0.0
  3. var p: CMutablePointer = nil
  4. var a: Float[] = [1.0,2.0,3.0]
  5. takesAMutablePointer(nil)
  6. takesAMutablePointer(p)
  7. takesAMutablePointer(&x)
  8. takesAMutablePointer(&a)

当函数被声明使用一个CMutableVoidPointer参数,那么这个函数接受任何和CMutablePointer类型相似的Type操作数。

如果您这样定义了一个函数:

 
  1. //Swift
  2. func takesAMutableVoidPointer(x: CMutableVoidPointer) { /* ... */ }

那么您可以使用以下任何一种方式来调用这个函数:

 
  1. //Swift
  2. var x: Float = 0.0,y: Int = 0
  3. var p: CMutablePointer = nil,q: CMutablePointer = nil
  4. var a: Float[] = [1.0,3.0],b: Int = [1,2,3]
  5. takesAMutableVoidPointer(nil)
  6. takesAMutableVoidPointer(p)
  7. takesAMutableVoidPointer(q)
  8. takesAMutableVoidPointer(&x)
  9. takesAMutableVoidPointer(&y)
  10. takesAMutableVoidPointer(&a)
  11. takesAMutableVoidPointer(&b)

C 常指针

当一个函数被声明为接受CConstPointer参数时,这个函数可以接受下列任何一个类型作为参数:

1.nil,作为空指针传入。

2.一个CMutablePointer,CMutableVoidPointer,CConstPointer,CConstVoidPointer,或者在必要情况下转换成CConstPointer的AutoreleasingUnsafePointer值。

3.一个操作数是Type类型的左值的in-out表达式,作为这个左值的内存地址传入。

4.一个Type[]数组值,作为一个数组的起始指针传入,并且它的生命周期将在这个调用期间被延长。

如果您这样定义了一个函数:

 
  1. //Swift
  2. func takesAConstPointer(x: CConstPointer) { /*...*/ }

那么您可以使用以下任何一种方式来调用这个函数:

 
  1. //Swift
  2. var x: Float = 0.0
  3. var p: CConstPointer = nil
  4. takesAConstPointer(nil)
  5. takesAConstPointer(p)
  6. takesAConstPointer(&x)
  7. takesAConstPointer([1.0,3.0])

当函数被声明使用一个CConstVoidPointer参数,那么这个函数接受任何和CConstPointer相似类型的Type操作数。 ?

如果您这样定义了一个函数:

 
  1. //Swift
  2. ????func takesAConstVoidPointer(x: CConstVoidPointer) { /* ... */ }

那么您可以使用以下任何一种方式来调用这个函数: ?

 
  1. //Swift
  2. var x: Float = 0.0,y: Int = 0
  3. var p: CConstPointer = nil,q: CConstPointer = nil takesAConstVoidPointer(nil)
  4. takesAConstVoidPointer(p)
  5. takesAConstVoidPointer(q)
  6. takesAConstVoidPointer(&x)
  7. takesAConstVoidPointer(&y)
  8. takesAConstVoidPointer([1.0,3.0]) takesAConstVoidPointer([1,3])

自动释放不安全指针

当一个函数被声明接受AutoreleasingUnsafePointer参数时,这个函数可以接受下列任何一个类型作为参数:

1.nil,作为空指针传入。

2.一个AutoreleasingUnsafePointer值。

3.其操作数是原始的,复制到一个临时的没有所有者的缓冲区的一个输入输出表达式,该缓冲区的地址传递给调用,并返回时,缓冲区中的值加载,保存,并重新分配到操作数。

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

如果您这样定义了一个函数:

 
  1. //Swift
  2. func takesAnAutoreleasingPointer(x: AutoreleasingUnsafePointer) { /* ... */ } </NSDATE?>

那么您可以使用以下任何一种方式来调用这个函数:

 
  1. //Swift
  2. var x: NSDate? = nil
  3. var p: AutoreleasingUnsafePointer = nil </NSDATE?>
  4. ?
  5. takesAnAutoreleasingPointer(nil)
  6. takesAnAutoreleasingPointer(p)
  7. takesAnAutoreleasingPointer(&x)

注:C语言函数指针没有被Swift引进。

全局常量

在C和Objective-C语言源文件中定义的全局常量会自动地被Swift编译引进并做为Swift的全局常量。

预处理指令

Swift编译器不包含预处理器。取而代之的是,它充分利用了编译时属性,生成配置和语言特性来完成相同的功能。因此,Swift没有引进预处理指令。

简单宏

在C和Objective-C,您通常使用的#define指令定义的一个基本常数,在Swift,您可以使用全局常量来代替。例如:一个全局定义#define FADE_ANIMATION_DURATION 0.35,在Swift可以使用let FADE_ANIMATION_DURATION = 0.35来更好的表述。由于简单的用于定义常量的宏会被直接被映射成Swift全局量,Swift编译器会自动引进在C或Objective-C源文件中定义的简单宏。

复杂宏

在C和Objective-C中使用的复杂宏在Swift中并没有副本。复杂宏是那些不用来定义常量的宏,包含带括号的函数式宏。您在C和Objective-C使用复杂的宏以避免类型检查的限制,或避免重新键入大量的样板代码。然而,宏也会产生Bug和重构的困难。在Swift中你可以使用函数和泛型来达到同样的效果,无需任何的妥协。因此,在C和Objective-C源文件中定义的复杂宏在Swift是不能使用的。

编译配置

Swift代码和C、Objective-C代码被有条件地,以不同方式编辑。SWIFT代码可以根据生成配置的评价可以有条件地编译。生成配置包括true和false字面值、命令行标志以及下表中的平台测试函数。您可以使用-D <#Flag#>指定命令行标志。

注意:arch(arm) 的编译配置不会为64位arm设备返回true。当为32位iOS 模拟器编译代码时,arch(i386)的编译配置返回true。

一个简单的有条件编译可以像下面这段代码:

 
  1. #if build configuration
  2. statements
  3. #else
  4. statements
  5. #endif

一个由零个或多个有效的Swift语句声明的statements,可以包括表达式,语句和控制流语句。您可以添加额外的构建配置要求,条件编译说明用&&和| |操作符,否定生成配置使用!操作符,添加条件控制块用#elseif:

 
  1. #if build configuration && !build configuration
  2. statements
  3. #elseif build configuration
  4. statements
  5. #else
  6. statements
  7. #endif

与C语言编译器的条件编译相反,Swift条件编译语句必须完全是自包含和语法有效的代码块。这是因为即使它没有被编译的Swift代码也是被进行语法检查。

swift与Objective-C的互用性的更多相关文章

  1. html5利用canvas实现颜色容差抠图功能

    这篇文章主要介绍了html5利用canvas实现颜色容差抠图功能,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 异常断点处于活动状态时,应用程序在启动时崩溃

    我刚开始继续开发一款适用于商店的传统iPad应用程序.我注意到项目中的异常断点未启用.当我启用它时,应用程序在启动时崩溃,但在输出窗口中没有给出任何信息,而在线程视图中只有相当无用的信息(见下文)我试着解决它..>将Autolayout设置为关闭.>通过编辑和重新保存故事板文件..但到目前为止没有运气.我的猜测是,故事板中的某些内容被破坏了,因为AppDelegates“确实完成了启动……”

  3. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  4. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  6. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  7. ios – Objective-C中“and”关键字的含义是什么?

    我在Xcode中输入了一条评论,但忘了领先//.我注意到了这一点并且突出显示为关键字.我做了一些谷歌搜索,但我似乎无法弄清楚它做了什么.这是什么意思?解决方法它是&&的同义词.见iso646.h.

  8. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  9. ios – Objective-C中的Google用户serverAuthCode nil

    我正在尝试将GoogleSignIn框架集成到iOS应用程序中,并对服务器上的用户进行身份验证.我设法登录用户,但在–(void)signIn:(GIDSignIn*)signIndidSignInForUser:(GIDGoogleUser*)用户withError:(NSError*)错误委托方法,user.serverAuthCode为nil,我需要通过此服务器身份验证代码,嗯,验证服务器上

  10. ios – 无法识别的选择器发送到实例NSTimer Swift

    解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部