Swift与Objective C的简单对比

现在Swift和Objective C的竞争正在飞快加剧。 这是很容易理解的,因为他们都有各自的好处,一些开发人员对对如何选择一个适合项目的编程语言产生了困惑。

首先,这两者之间的选择是没有严格的答案。在做出选择之前,要考虑很多事情,包括各种因素和特征、各自缺点和优点。 因此,这里做一个概述,以客观展示双方之间的差异和利弊,因为我们认为明智的做法是选择根据是否适合自己的开发团队和具体项目进行选择。

管理考虑

第一个考虑是根据特定团队选择。即使Swift通常被称为更简单,更平滑的语法语言,它消除了更复杂的Objective-C的一些麻烦,但仍然有一些进入门槛。这里正确的问题不是“如果团队能够使用Swift / Objective-C构建新项目会怎样”,而是“现在的团队是否能使用它在截止日期之前完成任务?

与你的团队开会询问他们,必须确保他们不仅能够使用Swift实现,而且确保及时完成。如果团队是Objective-C专家,强制他们使用Swift并在一个有严格期限的项目上使用并不是一个好主意。反之亦然。 严格的截止日期决定了团队使用最舒适的语言(如果没有被环境覆盖)。

项目规模

下一个考虑可能是的项目的规模。 小型项目可以从Swift的简单语法,文件结构等功能中受益,而大型项目则可能会受到Swift这是一门年轻语言的影响。当然会有Xcode转换到新版本的手段,但他们不是完美的,随着项目增长事情变得更糟。Swift因为年轻也带来了一些缺点,比如错误和不稳定性,以Swift的原生IDE - Xcode为例,经常报告崩溃现象发生,Xcode语言的许多不兼容等问题也有报道,虽然Xcode中提升效率相当快,许多错误已经解决。 但是有些新错误还会来。

技术原因

这两种语言之间有多种区别,但它们至少有一个重要的特征 -它们都是苹果公司的主要编程语言,适用于所有苹果平台的应用程序开发。 Objective-C早在八十年代早期就已经开发出来,它属于Generation X.原始的Cocoa是写在其中的,虽然Swift的书面部分自2014年推出以来一直被添加到Cocoa和Cocoa Touch。

Objective-C是C的严格超集,从Xerox Smalltalk得到其面向对象的语法。 它的性质是高度动态的,具有动态绑定和动态类型,而Swift有静态类型检查。

现在让我们看看这两种语言的优势,一方优势可以被认为是另一一方弊端。

为什么选择Swift

使用方便

Swift的设计更容易使用,比Objective-C更容易阅读理解。它的语法更接近自然的英语,放弃了一些传统的约定 - 没有更多的括号链,在任何对象相关的关键字或Objective-C特定类型之前没有更多的“@”。 看起来更清晰; Swift有时被称为“没有C的Objective-C”。Swift不是基于C的,不仅简化了语法,而且降低了Java,Python,C ++等程序员用于掌握Swift的门槛。

Swift也不那么冗长,特别是在字符串处理中,甚至支持使用简单的“+”添加字符串。

内存管理在整个代码中是统一的,不同于以前的面向对象,自动引用计数(ARC)现在可以在代码的面向对象和过程两部分中同时适用。 Objective-C会有大量的内存泄漏,Swift使这点变得不可能了,并解放了程序员的开发时间。

此外,Swift不使用双文件系统,没有更多的.h头文件+ .m实现文件,只有一个.swift代码文件(感谢LLVM编译器和Xcode IDE依赖处理)。

安全

Swift被设计成一种安全的语言。在这个世界上没有不发生故障的安全语言,但是错误处理是非常好的考虑,类型系统是非常强大的。

不像Objective-C不会在nil指针调用上抛出异常,比如说,如果你试图调用一个未初始化的指针变量的方法,它只是使这个表达式为无操作,在Swift的可选类型和值类型使得在nil指针调用上生成编译器错误。这意味着无操作相关的不可预测的不稳定行为消失了,它大大缩短了错误修复费用。

动态库

在iOS 8中,一个期待已久的新技术被带到了移动平台 - 支持动态库。 从那时起,Swift应用程序能够与Swift的较新版本链接,允许Swift在演变上比iOS更快,这是现代语言必须的。 动态库也是外部的应用程序可执行文件,允许较小的初始下载和差异化的移动和嵌入式应用程序的负载。

未来

Swift可能只有两年时间,但自2014年以来,它的流行度已经迅速增长到所有开源Cocoa项目的30%左右。随着苹果明确瞄准Swift取代Objective-C作为他们的主要语言,未来将转向Swift。

但这不是一个明天就能达到的问题,这种过渡将需要一些时间,但它预计在5 - 10年左右,因此有开发人员适应的时间。

颇为青睐的效率苹果软件缺陷报告工具显示苹果有多努力地为Swift推广。苹果还将适应社区的想法,吸收其知识和经验,并在未来版本中实施其解决方案。 完美的方式。

为什么选择Objective-C

兼容性和支持

尽管Xcode团队的努力,但是IDE不是很好支持Swift,因为可能它太新了。自动完成滞后了,语法突出几乎是非基础功能的,重构工具会不工作。 使用Objective-C编程已经有一段时间了(> 30年了!),它非常成熟,有非常辉煌的工具支持。

由于Swift是“无C语言”,C ++库在这里不可用。 同样的包括C ++跨平台SDK和API的基础(如的CoreFoundation )。

有一些工具如桥接和包装类,但这些努力通常不值得,坚持Objective-C最好的情况下是使用C ++和Foundation API。

Swift不仅年轻,而且与旧的操作系统不兼容,它的支持从iOS 7.0+和Mac OS 10.9+开始(tvOS和watchOS支持任何版本的Swift),因此Objective-C是老平台的首选工具平台。

专业

不仅一些团队在Objective-C上有更多的经验,但是如果你有兴趣外包你的项目的一些部分,更容易找到第三方专家。

动态

尽管Swift可以从静态类型检查中获益于优化,但是即时添加的方法不再可用,所有类型都在运行时之前定义。 如果你绝对需要动态类型,那么Swift是不行的。

运行

Objective-C是一个更加确定的平台,因此它有一个更稳定,更强硬和可靠的运行时。 我们不想说Swift不能实现这个规模,但它需要时间。

结论

正如我们所看到的,两种语言都有自己的优势和权衡,但他们确实有可能一起工作(在较小的项目中,但最好是)。

(0)

相关推荐

  • Swift中switch语句区间和元组模式匹配

    废话不多说了,下面一段代码给大家介绍了switch语句区间和元组模式匹配,具体内容如下所示: // switch 的广义匹配 let x = 1000 // 也就是说并没有像C语言那样 要求 switch 后面的是整数常量 switch x { // case后面可以跟区间啦 case 1...9: print("个位数") case 10...99: print("十位数") case 100...999: print("百位数") case

  • Swift 中闭包的简单使用

    本文主要是介绍Swift中闭包的简单使用,将从"闭包的定义"."闭包的创建.赋值.调用"."闭包常见的几种使用场景","使用闭包可能引起的循环强引用" 四个方面入手,重点介绍闭包如何使用,没有高深的概念,只是专注于实际使用,属于入门级水平,后面还会有关于闭包更加详细和深入理解的文章.希望大家在阅读完本文后能够对闭包有一个整体的理解以及能够简单的使用它. 闭包的定义 在Swift开发文档中是这样介绍闭包的:闭包是可以在你的代码中

  • Swift中swift中的switch 语句

    废话不多说了,直接给大家贴代码了,具体代码如下所示: /** switch 语句 */ let str = "aAbBacdef" let str2 = "aAbBadef" let str3 = "aAbBadeff" // var array = []; for c in ["A", "a", str3] { switch c { // case "a": case "a&

  • Swift中循环语句中的转移语句 break 和 continue

    下面通过实例代码给大家介绍了Swift中循环语句中的转移语句 break 和 continue,具体代码如下所示: /** 循环语句中的转移语句 break 和 continue */ let array:Array = [3, 4, 5, 6, 7, 8, 9] for k in array { if k == 5 { print(k) break } } print("--------->") for k in array { if k == 5 { // 结束本次循环,进入

  • Swift开发中switch语句值绑定模式

    Switch简介 Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有过编程经验的人对Switch语句都不会感到陌生,但苹果对Switch进行了大大的增强,使其拥有其他语言中没有的特性. // switch语句值绑定模式 let point = (100, 10) switch point { // 遇到有匹配的就不会在执行下一个了 这样子也可以啊case let (x, y) case (let x, let y): print("\(x): \(y)") //

  • Swift数组详细用法解析

    一.说明 Swift数组中的类型必须一致,这一点与OC不同 // 数组初始化 var numbers = [0,1,2,3,4,5] var vowels = ["A","E","I","O","U"] // 数组的类型: [Int] 或者 Array<Int> //var numbers: [Int] = [0,1,2,3,4,5] //var numbers: Array<Int>

  • 简单了解Swift语言中的break和continue语句的用法

    break语句 在 C 编程语言中的 break 语句有以下两种用法: 当在循环中遇到 break 语句, 循环立即终止,程序控制继续循环语句的后面(退出循环). 它可用于终止在switch语句(在下一章节)的情况(case). 如果使用嵌套循环(即,一个循环在另一个循环), break语句将停止最内层循环的执行,并开始执行下一行代码块之后的代码块. 语法 在Swift 编程中的 break语句的语法如下: 复制代码 代码如下: break 流程图 实例 复制代码 代码如下: import Co

  • Swift与Objective C的简单对比

    现在Swift和Objective C的竞争正在飞快加剧. 这是很容易理解的,因为他们都有各自的好处,一些开发人员对对如何选择一个适合项目的编程语言产生了困惑. 首先,这两者之间的选择是没有严格的答案.在做出选择之前,要考虑很多事情,包括各种因素和特征.各自缺点和优点. 因此,这里做一个概述,以客观展示双方之间的差异和利弊,因为我们认为明智的做法是选择根据是否适合自己的开发团队和具体项目进行选择. 管理考虑 第一个考虑是根据特定团队选择.即使Swift通常被称为更简单,更平滑的语法语言,它消除了

  • 浅谈Linux vfork与fork简单对比分析

    本文分享了Linux vfork与fork简单对比分析,分享给大家,具体如下: fork相关问题: 一.fork基础了解 fork作用为创建一个子进程,在使用了fork命令后,内核会分配新的内存块和数据结构给子进程,并且将父进程的部分数据结构内容拷贝到子进程,最后再将子进程添加到系统进程列表中,添加完成后fork返回,开始调度. 头文件:#include < unistd.h > 函数原型:pid_t fork( ) 返回值:返回值大于0则当前进程为父进程,等于0代表为子进程,小于零代表创建子

  • Matplotlib实现subplot和subplots简单对比

    前言: 大家一般都知道subplot可以画子图,但是subplots也可以画子图,鉴于subplots介绍比较少,这里做一个对比,两者没有功能一致. 对比开始: 需求:画出两张子图,在一行显示,子图中的内容一模一样 subplot代码: ax1 = plt.subplot(1,2,1) ax1.scatter(positive['X1'], positive['X2'], s=50, marker='x', label='Positive') ax1.scatter(negative['X1']

  • swift中defer几个简单的使用场景详解

    前言 最近准备把 swift 文档再扫一遍,发现了 defer 这个关键字,defer 是个非常重要的 swift 语言特征,恕本人愚钝,以前还从来没有用过这个呢~ 简单地列一下这个东西有哪些可以用得上的情景吧~~话不多说了,来一起看看详细的介绍吧. defer 是干什么用的 很简单,用一句话概括,就是 defer block 里的代码会在函数 return 之前执行,无论函数是从哪个分支 return 的,还是有 throw,还是自然而然走到最后一行. 这个关键字就跟 Java 里的 try-

  • 简单对比分析Ruby on Rails 和 Laravel

    在线web应用程序开发目前有许多正流行的框架.  也有许多不同类型的框架,比如那些拥有大量插件,可以让你更加快速的迭代 (比如 Rails),或者还有其它非常简单和低级别的 (比如 Flask). web应用程序开发中两个相对而言更加流行的框架是 Ruby on Rails 和 Laravel.  它们两个都是非常成熟的项目,已经面世相当长一段时间了 .  Ruby on Rails 在2005年12月被引入,而 Laravel 则是2012年2月 . 如上所示的第一次发布的时间, Larave

  • Swift Self详解及简单实例代码

    Swift中Self的使用 用于消除访问属性,调用方法时所产生的歧义. 当函数的参数名和自身的属性名同名时,例如: /* 使用self指明被访问的是自身属性还是参数 */ class AClass { var greeting: String init(greeting: String) { // 使用self区分属性和参数 self.greeting = greeting } } 在便利构造函数中调用自身的指定构造函数时,例如: convenience init() { /* 必须使用self

  • 简单对比C#程序中的单线程与多线程设计

    多线程概念 1.一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括多个线程.线程是操作系统分配处理器时间的基本单位 2.应用程序域是指进行错误隔离和安全隔离,在CLR中运行,每个程序域都是单个线程启动,但该程序域中的代码可以创建附加应用程序域和附加线程 3.多线程的优点在于一个线程阻塞的时候,CUP可以运行其他的线程而不需要等待,这样大大的提高了程序的执行效率.而缺点在于线程需要占用内存,线程越多占用的内存就多,多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程,线程之间对共享

  • Swift中排序算法的简单取舍详解

    前言 对于iOS开发者来说, 算法的实现过程其实并不怎么关心, 因为只需要调用高级接口就可以得到系统最优的算法, 但了解轮子背后的原理才能更好的取舍, 不是么?下面话不多说了,来一起看看详细的介绍吧. 选择排序 我们以[9, 8, 7, 6, 5]举例. [9, 8, 7, 6, 5] 第一次扫描, 扫描每一个数, 如比第一个数小则交换, 直到找到最小的数, 将其交换至下标0. [8, 9, 7, 6, 5] [7, 9, 8, 6, 5] [6, 9, 8, 7, 5] [5, 9, 8, 7

  • Swift操作Quartz 2D进行简单的绘图与坐标变换的教程

    Quartz 2D简介 Quartz 2D是苹果公司开发的一个二维图形绘制引擎,同时支持iOS和Mac系统. 它是一套基于C的API框架,提供了低级别.轻量级.高保真度的2D渲染.它能完成的工作有: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 - Quartz 2D进行绘图 iOS绘图技术主要有UIKit,Quartz 2D,Core Animation和OpenGL ES.我们平常对UIKit应该不陌生,而Qu

  • 简单对比C语言中的fputs()函数和fputc()函数

    C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include <stdio.h> 定义函数: int fputc(int c, FILE * stream); 函数说明:fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中. 返回值:fputc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败. 范例 #include <stdio.h> main() { FILE * fp; char a[

随机推荐