微信号:infoqchina

介绍:有内容的技术社区媒体

Swift安全在哪儿?末尾有彩蛋!

2015-06-12 12:05 郭麟

类型安全语言


Swift是强类型语言,这意味着Swift禁止错误类型的参数继续运算。例如,你不能让String和Float相加。这与C#和Java一致;而与C和Javascript这类弱类型语言不一样。


Swift是静态类型语言,这意味着Swift中变量是在编译期进行类型检查的。编译时,编译器会尽力找出包括类型错误在内的相关错误。例如,String和Int相加这种类型运算错误,编译器在编译时就能告诉你,而不会在运行时才报错。这与C#和Java一致;而与Python和Ruby这类动态类型语言不一样。


Swift不允许不正确的类型运算或类型转换发生,所以Swift是类型安全的。


Swift支持类型推导,并且有一个相当不错的类型推导器。大部分情况下,你都不用声明类型,编译器可以根据上下文为你推导出变量的类型。


安全的初始化过程


Swift中类(包括结构体和枚举)的初始化过程类似于Java的设计。Swift 有一类特别的方法,被作为初始化方法,它们没有func前缀,而是以init为方法名。


这不同于Objective-C中的初始化方法只是一个普通的方法。对于初始化方法的特殊处理可以在语言机制上保证初始化方法只被调用一次。这种机制在Objective-C中是不存在的,在 Objective-C中,初始化方法就像其它的普通方法一样,可以被多次调用。


Swift中初始化方法必须保证所有实例变量都被初始化。Swift初始化方法要求特殊的初始化顺序。先保证当前类的实例变量被初始化,再调用父类的初始化方法完成父类实例变量的初始化。


Swift保证了初始化方法只会被调用一次,同时所有的实例变量都会被初始化。这使得Swift初始化过程很安全。


安全的重写


Swift提供了重写(Overriding)保护机制。如果要重写基类的方法,就必须在子类的重写方法前加上overriding关键字。这么做是向编译器声明你想提供一个重写版本。编译器会确认,基类里是否存在具有相同方法定义的方法。如果,基类中没有相同的方法定义,编译器就会报错。


另一方面,如果没有加上overriding关键字的方法和基类的某个方法的定义相同,编译器也会报错,以防止意外的重写行为。这样就能从两方面保证重写行为的正确性。


Optionals


Swift中的Optionals让我们能够更安全地应对有可能存在,也有可能不存在的值。在Objective-C里我们主要依靠文档来了解一个API是否会返回nil。Optionals则让我们将这份责任交给了类型系统。如果API的返回值声明为Optional,就表示它可以是nil。如果它不是Optional,就表示它不可能是nil。


在Swift中,类型后面加问号声明Optional类型,以及感叹号!对 Optional类型拆包都只是语法糖。


Optionals其实是由枚举实现的:

enum Optional<T> : 
Reflectable, NilLiteralConvertible { case None
case Some(T)
//...}


也就是说,Optional其实是一种枚举类型。我们通过语言的类型系统来明确可能为nil的情况。这比Objective-C中使用文档来说明要安全得多。


号外:“运维”专题の线上活动终于来了!




支付宝携程事件后,InfoQ也如之前报道中所述,一直在策划“运维”相关专题。


针对本次事件复盘,我们特别策划了一场讨论沙龙,届时将有触控科技运维专家萧田国,环信首席架构师梁宇鹏,腾讯互娱运营管理中心总监刘栖桐等技术大牛针对“运维”展开讨论。


由于考虑到有朋友可能不在京,或者比较忙无法到现场,此次活动我们特设了线上直播免费互动参与等方式,详情请手动识别二维码,添加关注回复“616”即可报名免费参与!




版权及转载声明:


极客邦科技专注为技术人提供优质内容传播。尊重作者、译者、及InfoQ网站编辑的劳动,所有内容仅供学习交流传播,不支持盗用。未经许可,禁止转载。若转载,需予以告知,并注明出处。


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 2016年Q1的Facebook广告指标趋势 如何Get一个领域语言?这么撸就对了! 冬日寒风中听好声音 “天猫·喵葩”电商互动生态共创论坛-深圳站 回家过年,关于这份礼品你该打开看看