Swift和Objective-C的差异性
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的差异性的更多相关文章
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- Swift与Objective-C中的闭包
Swift Code: func makeIncrementor(forIncrement amount: Int) -> (() -> Int,() -> Int) { func ...
- Swift调用Objective C的FrameWork
很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...
- Swift和Objective C关于字符串的一个小特性
一.Unicode的一个小特性 首先,Unicode规定了许多code point,每一个code point表示一个字符.如\u0033表示字符"3",\u864e表示字符&qu ...
- 开发 Swift 和 Objective-C 混编的 Framework
来源:黄文臣 blog.csdn.net/hello_hwc/article/details/58320433 前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C ...
- 使用命令行工具运行Xcode 7 UI Tests
原文:Run Xcode 7 UI Tests from the command line 苹果在Xcode 7中引入了一项新技术UI Tests,允许开发者使用Swift或Objective C代码 ...
- 手把手教你从Core Data迁移到Realm
来源:一缕殇流化隐半边冰霜 (@halfrost ) 链接:http://www.jianshu.com/p/d79b2b1bfa72 前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那 ...
- 手把手教你从 Core Data 迁移到 Realm
前言 看了这篇文章的标题,也许有些人还不知道Realm是什么,那么我先简单介绍一下这个新生的数据库.号称是用来替代SQLite 和 Core Data的.Realm有以下优点: 使用方便 Realm并 ...
- realm-java 源码疑问
JNIEXPORT void JNICALL Java_io_realm_internal_Group_nativeWriteToFile( JNIEnv* env, jobject, jlong n ...
- 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...
随机推荐
- 查看IIS进程id
Windows 2003 cscript C:\windows\system32\iisapp.vbs -a Windows 2008 C:\windows\system32\inetsrv\appc ...
- 16进制字符串转换为byte数组
/// <summary> /// 16进制字符转换为byte数组 /// </summary> /// <param name="hexString" ...
- c++中各种数据类型所占字节
求各种数据类型所占用的字节数可调用sizeof函数,求各种数据类型的最大值可以调用limits标准库中的numeric_limits<T>::max(),numeric_limits< ...
- jq操作cookie
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iOS中json解析出现的null,nil,NSNumber的问题
在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式. 问题现象 但是几个项目下来一直遇到一个坑爹的问题,程序在获取某些数据之后莫名崩溃.其实很早就发现了原因:由于 ...
- B - Maya Calendar(第二季水)
Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...
- Eclipse安装与搭建Maven
Maven的具体参考书可以看:<Maven实战> 下载maven可以到:http://maven.apache.org/ Maven的eclipse基本使用可以在这里看到:http://w ...
- 定义#define
定义符号常量 当我们不止一次用到某个符号常量时,常选择对符号变量进行定义,这样就能当成一般常量来用. ...
- Repository仓储 UnitofWork
Repository仓储 UnitofWork 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对 ...
- HeadFirst设计模式读书笔记(4)-工厂模式
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 所有工厂模式都用来封装对象的创建.工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象 ...