Swift学习: 从Objective-C到Swift

这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。

文章组织脉络:

从Objective-C到Swift的语法差异。我们熟悉的Objective-C特性在Swift中如何展现。
从Objective-C到Swift的进步改进。研究对比Swift在安全性,易用性上的提升,给我们带来的新编程范式。

目录:

1.属性(property)和实例变量(instance variable)

2.控制流

3.函数

4.类与初始化(Initializers)

5.枚举与结构体

6.协议(Protocols)

7.Swift与Cocoa

8.总结

1.属性(property)和实例变量(instance variable)

Objective-C property in Swift world

在Cocoa世界开发的过程中,我们最常打交道的是property.

典型的声明为:

而在Swift当中,摆脱了C的包袱后,变得更为精炼,我们只需直接在类中声明即可。

注意到这里,我们不再需要@property指令,而在Objective-C中,我们可以指定property的attribute,例如strong、weak、readonly等。

而在Swift的世界中,我们通过其他方式来声明这些property的性质。

需要注意的几点:

strong: 在Swift中是默认的
weak: 通过weak关键词申明

readonly,readwrie 直接通过声明变量var,声明常量let的方式来指明
copy 通过@NSCopying指令声明。

值得注意的是String、Array和Dictionary在Swift是以值类型(value type)而不是引用类型(reference type)出现,因此它们在赋值、初始化、参数传递中都是以拷贝的方式进行(简单来说String,Array,Dictionary在Swift中是通过struct实现的)

延伸阅读:Value and Reference Types

nonatomic,atomic 所有的Swift properties都是nonatomic。但是我们在线程安全上已经有许多机制,例如NSLock、GCD相关API等。个人推测原因是苹果想把这一个本来就用的很少的特性去掉,线程安全方面交给平时我们用的更多的机制去处理。

然后值得注意的是,在Objective-C中,我们可以跨过property直接与instance variable打交道,而在Swift是不可以的。

例如:我们可以不需要将someString声明为property,直接使用即可。即使我们将otherString声明为property,我们也可以直接用_otherString来使用property背后的实例变量。

而在Swift中,我们不能直接与instance variable打交道。也就是我们声明的方式简化为简单的一种,简单来说在Swift中,我们只与property打交道。

A Swift property does not have a corresponding instance variable, and the backing store for a property is not accessed directly

小结

因此之前使用OC导致的像巧哥指出的开发争议就不再需要争执了,在Swift的世界里,我们只与property打交道。
并且我们在OC中init和dealloc不能使用属性self.property = XXX来进行设置的情况得以解决和统一。

(不知道这一条规定,在init直接用self.property = value 的同学请自觉阅读iOS夯实:内存管理)

:)

个人觉得这看似小小一点变动使Swift开发变得更加安全以及在代码的风格更为统一与稳定。

Swift property延伸:

Stored Properties和Computed properties

在Swift中,property被分为两类:Stored Properties和Computed …