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.

典型的声明为:

@property (strong,nonatomic) NSString *string;

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

class Shape {

    var name = “shape”

}

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

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

需要注意的几点:

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

weak var delegate: UITextFieldDelegate?

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背后的实例变量。

@interface SomeClass : NSObject {

  NSString *someString;

}

@property(nonatomic, copy) NSString* otherString;

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

A Swift property does not have a corresponding instance variable, and the backing store …