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. 查看IIS进程id

    Windows 2003 cscript C:\windows\system32\iisapp.vbs -a Windows 2008 C:\windows\system32\inetsrv\appc ...

  2. 16进制字符串转换为byte数组

    /// <summary> /// 16进制字符转换为byte数组 /// </summary> /// <param name="hexString" ...

  3. c++中各种数据类型所占字节

    求各种数据类型所占用的字节数可调用sizeof函数,求各种数据类型的最大值可以调用limits标准库中的numeric_limits<T>::max(),numeric_limits< ...

  4. jq操作cookie

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. iOS中json解析出现的null,nil,NSNumber的问题

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式. 问题现象 但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃.其实很早就发现了原因:由于 ...

  6. B - Maya Calendar(第二季水)

    Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...

  7. Eclipse安装与搭建Maven

    Maven的具体参考书可以看:<Maven实战> 下载maven可以到:http://maven.apache.org/ Maven的eclipse基本使用可以在这里看到:http://w ...

  8. 定义#define

                                                    定义符号常量   当我们不止一次用到某个符号常量时,常选择对符号变量进行定义,这样就能当成一般常量来用. ...

  9. Repository仓储 UnitofWork

    Repository仓储 UnitofWork 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对 ...

  10. HeadFirst设计模式读书笔记(4)-工厂模式

    工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 所有工厂模式都用来封装对象的创建.工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象 ...