Objective-C和Swift IOS开发哪家强?

Objective-C和Swift IOS开发哪家强?

最近一些朋友问我:刚开始做IOS开发,学哪门语言好一些? 今天我就讲讲这方面的事情。

到目前为止,IOS原生开发只有两门语言可选择---Objective-C(以下简称OC)和 Swift。那么这两门语言该怎么选择?这两门语言又有哪些方面的优劣势呢?

Objective-C

OC是上个世纪80年代就出现的语言,在Swift出现之前,是唯一用在IOS开发的语言。OC是从C语言演变而来的,属于C语言的超集。经过四十年多的发展,OC吸收了当时最新的编程语言思想,先后新增加了属性、类目、扩展等新特性。逐渐发展成面向对象(OOP)的语言了。

因为OC的古老,很多语法很怪、很繁杂(也是比较出名的啰嗦),导致对编程语言的初学者不太友好,再加上做IOS开发需要配置一台mac电脑,而一台mac电脑可是价格不菲的,这样导致很多的初学者放弃了IOS开发,转做安卓了。

Swift

Swift是2014年由苹果新发布的IOS开发的语言,到目前为止,已经演进到Swift 5了。

Swift属于入手难度低,学习Swift语法最好的方式是阅读 英文版的官方教程,如果想看中文版,可以参考国内的 SwiftGG 组织翻译的中文版教程。

Swift是一种强类型语言。具有比OC更高的效率的一门语言。当初推出Swift语言,站在苹果公司的角度来说,因OC的古老,希望一门与时代相匹配的,具有最新编程思想和特性的语言来替换OC语言(当时很多语言(Java,Python)都有一些新特性,而OC 没有)。然而经过几年的发展,倒是没有出现谁替换谁,谁消灭谁的可能。而是两门语言共同存在,共同成长。

OC与Swift的关系

OC和Swift都属于编程开发语言,并且主要在IOS开发使用。当然Swift支持跨平台开发的,开发后的程序可以Linux等系统上运行。

在IOS开发中,两语言都是运行在一套运行环境中,两语言类型可以通过桥接方式相互链接,OC很多的类库可以在Swfit直接使用,OC的很多概念(ARC,属性,协议,接口,扩展类)等等在Swift继续有效。但是Swift的新特性(范型,元组)就不能在OC上使用了。

下面我详细说下Swift的优劣势:

优势:

1、Swift可读性比较好,语法和文件结构简单化。

2、Swift代码量少了,语法相对OC来说,简洁多了,省去大量冗余代码

3、Swift安全性高,因为它是类型安全的语言。

4、Swift速度更快,运算性能更高。

劣势:

1、版本不稳定,通过多次迭代,尚未完全稳定,目前最新的是Swift5。

2、使用人数比较少, 还是以OC的开发人员为主。

3、社区的开源项目偏少,市面上的开源项目大多以OC为主 ,支持Swift的不多,当然这个情况在慢慢改变。

4、很多公司以稳为主,还是在使用OC开发,比较少进行混合开发,更少纯Swift开发。

5、Swift开发相关的网络资料比较少,难以查找。

6、已经开发完成的OC功能模块,不能简单方便地移植到Swift, 还需要大量的桥接开发工作。

Swift的差异细节

1、swift不分.h和.m文件,一个类只有.swift一个文件,所以整体的文件数量比起OC有一定减少。

2、swift句尾不需要分号,OC每一行结束都必须写上分号。

3、swift使用print打印日志,不同于OC的NSLog。打印变量时可以print("\(value)"),不用像OC那样记很多%@,d%等。

4、swift的循环语句中必须加{}就算只有一行代码也必须要加

5、swift语言if后的括号可以省略: if a>b {},而OC里if后面必须写括号。

6、字符连接链接,通过+号就可以直接把两字符串链接起来。(很像Python语言)

7、采用和C类似的构造函数写法,屏蔽了[Test alloc] init]这种写法

8、swift数据类型都会自动判断,只区分变量var和常量let,类型也没有OC那么长串了;而OC有一堆的数据类型(int,NSIntger)

9、强制类型转换格式不同,OC强转:(int)a;Swift强转:Int(a)

10、BOOL类型更加严格,Swift不再是OC的非0就是真,而是true才是真,false才是假

11、swift的switch语句后面可以跟各种数据类型了,如Int、字符串都行,并且里面不用写break(OC不能字符串)

Swift 其他功能特性

1.Swift的可选项类型(Optionals)

Swift引入了可选项类型,用于处理变量值不存在的情况。Optionals类似于OC中指向nil的指针,但是适用于所有数据类型,而非仅仅局限于类,Optionals相比于OC中的nil指针,更加安全和简明,并且也是Swift诸多最强大功能的核心。

2.Swift中的 !和 ?

这两个符号是用来标记这个变量的值是否可选,!表示可选变量必须保证转换能够成功,否则报错,但定义的变量可以直接使用;?表示可选变量即使转换不成功也不会报错,变量值为nil,如果转换成功,要使用该变量时,后面需要加!进行修饰。

3.Swift的访问权限变更

swift新增了两种访问权限,权限更细化。具体查看这里:

访问权限由大到小依次为:open,public,internal(默认),fileprivate,private

open:可以任何人或任何模块都可以使用,包括override和继承。

public:可以被任何人访问, 只有本模块内才可以override和继承,其他模块不能。

internal:

(1)internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。

(2)如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。

(3)如果是App代码,也是在整个App代码,也是在整个App内部可以访问。

fileprivate:

文件内私有。即在文件访问内可以访问,超出文件访问不能访问。

private:

真正的私有,离开了这个类或者结构体的作用域外面就无法访问。

4.函数式编程

Swift提供了Map、FlatMap、Filter、Reduce等函数方法,能够大大方便我们对对象处理。

Map:

var values = [1,2,3,4]

let res = values.map ({ (el) -> Int in

return el * 2

})

//"[2, 4, 6, 8]"

Filter:

var values = [1,2,3,4,5]

let res = values.filter{ $0 % 2 == 0}

//[2, 4]

5.动态性

Swift中的动态性可以通过OC运行时来获得。(所谓的运行时,就是直到调用过程才知道执行的函数,这个是OC特有的特性,为开发者带来的灵活性)。但是Swift开源并迁移到Linux的版本就不支持运行时,因为Linux没有包含运行时库。在IOS开发中, Swift如果真的想使用动态功能的话,就需要使用 @dynamic。(但是使用@dynamic 修饰符,就不需要使用@objc 了,因为它已经隐含在其中)。

总结:

IOS开发,如一定要选择学哪门语言的话,个人建议先学OC,学好之后在学Swift。因为在IOS开发过程掌握两门语言,会更好些。

有兴趣,请关注 程序员华仔

发布于 2022-05-23 15:34