1:Type

Swift提供了类型推断,不需要人工的去注释变量的类型信息,编译器会通过变量的值来推断类型。例如,编译器可以自动将该变量设置为字符串:

// 自动推断,不显示
var name1 = "Matt"
// 显示类型
var name2:String = "Matt"  

这也就意味着类型安全,编译器(在绝大多数情况下)知道对象的所有类型,这使得编译器可以决定如何去编译代码。与之相比,objective-c在本质上是非常得动态的。在objective-c中,所有类型都是在编译时就已知的。这部分是因为你可以将现有的方法添加到现有的类中,添加新的类,甚至可以在运行时更改实例的类型。

接下来做一些更详细的对比:

Person *matt = [[Person alloc] initWithName:@"Matt Galloway"];
[matt sayHello];

当编译器看到电话打招呼,可以看看有没有一个方法声明在头上都能看到它的人叫打招呼。如果没有一个,它可以错误,但这是关于所有它可以做。这往往足以赶上第一行的错误,您可能会介绍。它会像错别字。但由于动态性,编译器不知道打招呼要在运行时甚至不一定存在变化。它可以是一个可选的方法在一个协议,例如。(还记得那些respondstoselector:支票?)。
因为缺乏强类型,很少有编译器可以做优化,当调用方法在Objective-C中处理动态调度的方法称为objc_msgsend。我相信你已经在许多回溯看到这个!在这个函数中,选择器的实现被抬起,然后跳到。你不能争辩这不增加开销和复杂度。

下面是同样的代码在Swift中:

var matt = Person(name:"Matt Galloway")
matt.sayHello()

在迅速,编译器知道更多的类型,在游戏中的任何方法调用。它知道哪里sayhello()定义。因为这样,它可以通过直接跳到执行,而不是通过动态调度来优化特定呼叫地点。在其他情况下,它可以使用vtable式调度,这比动态调度提示,这是调度,C++虚函数的类使用更少的开销。
编译器在迅速的帮助。这将有助于阻止隐蔽型相关的bug进入你的代码库。它也将使你的代码运行的更快的启用智能优化。

Swift和Objective-C的差异性的更多相关文章

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

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

  2. Swift与Objective-C中的闭包

    Swift Code: func makeIncrementor(forIncrement amount: Int) -> (() -> Int,() -> Int) { func ...

  3. Swift调用Objective C的FrameWork

    很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...

  4. Swift和Objective C关于字符串的一个小特性

    一.Unicode的一个小特性 首先,Unicode规定了许多code point,每一个code point表示一个字符.如\u0033表示字符"3",\u864e表示字符&qu ...

  5. 开发 Swift 和 Objective-C 混编的 Framework

    来源:黄文臣 blog.csdn.net/hello_hwc/article/details/58320433 前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C ...

  6. 使用命令行工具运行Xcode 7 UI Tests

    原文:Run Xcode 7 UI Tests from the command line 苹果在Xcode 7中引入了一项新技术UI Tests,允许开发者使用Swift或Objective C代码 ...

  7. 手把手教你从Core Data迁移到Realm

    来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那 ...

  8. 手把手教你从 Core Data 迁移到 Realm

    前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并 ...

  9. realm-java 源码疑问

    JNIEXPORT void JNICALL Java_io_realm_internal_Group_nativeWriteToFile( JNIEnv* env, jobject, jlong n ...

  10. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...

随机推荐

  1. 【输入输出挂】【Uva11462】Age Sort

    例题17  年龄排序(Age Sort, UVa 11462)照从小到大的顺序输出. [输入格式] 输入包含多组测试数据.每组数据的第一行为整数n(0<n≤2 000 000),即居民总数:下一 ...

  2. UIView的交换实现,子视图交替变换

    其中加了一些动画  2016-01-13 其中主要的方法有:Demo下载地址,Demo中有介绍:https://github.com/lizhaojie001/UIview.git

  3. ckplayer 项目实际应用代码整理,支持标清,高清,超清切换!

    ckplayer是个免费,小巧,功能强大的视频播放器,前段时间有个项目需要做个收费视频播放的功能,于是就用了ck,目前项目已经弄完,完美支持pc和手机端的播放,重要的是可以支持清晰度切换,最后加了个是 ...

  4. VS2013 编译错误 error: MSB8031

    VS2010 创建的 MFC 程序,用 VS2013 打开后编译出现错误: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microso ...

  5. navicat for mysql 将结果导出到txt文件

    其实navicat 是带这个导出功能的,可是很多人不知道怎么用. 1.如图:查询sql语句.得到结果

  6. Github android客户端源代码分析之一:环境搭建

    1.下载相应的包及项目,参考https://github.com/github/android/wiki/Building-From-Eclipse. 2.若需查看某些包的源文件或者javadoc,则 ...

  7. 如何在Eclipse中查看Android API源码以及support包源码

    http://my.eoe.cn/futurexiong/archive/181.html 开发第三方Android应用的,大多数人应该还是Eclipse结合ADT来开发.那么大多数时候我们可能希望点 ...

  8. 进程外Session和进程内Session存储

  9. Wcf实现IServiceBehavior拓展机制

    IServiceBehavior接口 描述:提供一种在整个服务内修改或插入自定义拓展机制: 命名空间:  System.ServiceModel.Description程序集:  System.Ser ...

  10. SQL Server 无法启动的 4 种原因

    SQL Server 无法启动的原因定位.首先要知道SQL Server 启动的过程. 第一步: 读取注册表,创建log文件.检测硬件.初始化系统配置. 第二步: 启动系统数据库. 第三步: 准备好网 ...