Swift 在对 Objective-C 改进的 6 个方面
在 Atomic Object 的安娜堡办公室,我们做了一个观看2014年的WWDC主题演讲,毫不夸张地说,当Swift宣布的时候,我们感到十分激动。Swift,苹果正在推进的一个更现代的编程语言。我很高兴能获得先机并开始用它开发。
在这篇博文中,我将重点介绍Swift的几个语言特性,这将使开发者的工作更加轻松。
Objective-C语言的问题
当一个开发者申请一个关于Atomic Object的新职位时,我们会给他填写一个(GTKY) Getting To Know You的表。这个表要求填写一些常见的问题,包括技术和其他方面,比如你最喜欢的语言是什么,你会做些什么来改进它?很多开发者的回答不能令人满意,即使开发人员选择objective-C作为他们最喜爱的语言时,也想不出如何改进它!
这个回答产生了大量的讨论,让我想起一个Objective-C的问题。仅举几例:
弱类型 - 通常处理id或class,并且需要可怕的C static casts 。
欠佳的枚举语法 - for in已经很好了,但我经常想到一个更好的索引。
缺少操作符重载的类,例如NSNumber的。
所以,我很高兴苹果宣布swift并公开了其语言细节。在这里我会谈一些对Objective-C语言的批评。我强烈建议开发人员下载Swift的书,看一看在Xcode 6的测试版
激动人心的Swift特性
1. 类型推断
对我来说这个很有用。无比烦恼的是你不得不将id类型的实例非安全的转化为实际类型,这很容易出错并且向一个实际对象并不相应的id发送信号。总是检查respondsToSelector太乏味了。Swift给我们提供了一个解决方案---var关键字:
1> var anInt = 0
anInt: Int = 0
2> var aDouble = 0.0
aDouble: Double = 0
3> var anotherDouble: Double = 0
anotherDouble: Double = 0
4> var aString = "some string"
aString: String = "some string"
注意:就像anotherDouble那种情况,你也可以显示的设置类型。可以用var同样的方式使用let来推断常量的类型。
2. 改进枚举语法
Objective-C有不错的集合枚举语法:
for (SomeType someObject in array)
NSLog(@"%@", someObject.whatever);
这是个不错的语法糖,但是问题是现实编程中,我通常需要一个和集合中元素实例一起的索引变量。.
Swift 给了我们许多有用的集合枚举器, 但是尤其令人高兴的是他们提供了一个全局的enumerate()方法,可以用来返回一个包含了数组中元素和索引的元组。
19> array
$R2: String[] = size=4 {
[0] = "one"
[1] = "two"
[2] = "three"
[3] = "four"
}
20> for (index, value) in enumerate(array) {
21. println("Item \(index): \(value)")
22. }
Item 0: one
Item 1: two
Item 2: three
Item 3: four
23>
3. Override关键字
当在类中声明一个实例函数时,如果他们覆盖了一个基类函数,他们必须标记为override的。如果没有这么做则会得到一个编译时错误。类似的,如果一个标记为override的函数没有覆盖基类的相应函数,同样得到一个编译错误。这一行为将的类更加的清晰和降低运行时崩溃的可能性。
4. 多返回值
在我加入Atomic之前的那份工作中,我主要开发C++,并且经常发现自己写一些输出多值的方法。我总是为决定使用引用,pair还是将返回值包装为struct或class来作为参数传递而挣扎不已。
在Swift中,有内置的机制来用一个由任意数量的带标记的数据成员的组成的元组作为多返回值。
46> func calculateStatisticsFromArray(data: Double[]) -> (mean: Double, median: Double, mode: Double) {
47. return (62, 44, 12)
48. }
49> var stats = calculateStatisticsFromArray([])
stats: (mean: Double, median: Double, mode: Double) = {
mean = 62
median = 44
mode = 12
}
50> stats.mean
$R10: Double = 62
51> stats.median
$R11: Double = 44
52> stats.mode
$R12: Double = 12
Swift同样支持声明多个变量来显示的获取多返回值:
<51> var(mean, median, mode) = calculateStatisticsFromArray(data)
5. willSet, didSet
在 Swift中, 类具有属性(类似于Objective-C)。有一个声明setter和getter的机制,如果属性的类型是简单的并且需要计算的,但是你想观察他们的变化,两个内置的需要覆盖的方法-willSet和didSet将会有帮助。
1> class Container {
2. var someValue: Double = 0.0 {
3. willSet {
4. println("willSet! \(newValue)")
5. }
6. didSet {
7. println("didSet! \(someValue)")
8. }
9. }
10. }
11> var c = Container()
c: Container = {
someValue = 0
}
12> c.someValue = 100.0
willSet! 100.0
didSet! 100.0
6. REPL
REPL表示“read-evaluate-print-loop”,我认为它是通过沙箱测试输出的代码.您可以输入代码到REPL,如果您在使用一个IDE或者喜爱的文本编辑器,它会被编译/解释和实时运行,并马上能让你看到输出结果。这是开发人员努力学习这门新语言时能看到的一个强大功能。我一直在使用它来学习swift。
使用SWIFT REPL:
1.下载Xcode 6 Beta版。
2.在终端中运行以下命令来切换路径xcrun:
sudo xcode-select -switch /Applications/Xcode6-Beta.app/Contents/Developer.
注意:如果要重置,请在使用终端里键入 xcode-select -r
3.xcrun swift
谁将拥有未来?
我坚信,在iOS 8和以后的版本中,Swift将成长成为iOS开发的主流语言。尽管如此,苹果已经向我们保证,在运行时将保持二者兼容:我们的Objective-C应用程序仍然可以继续工作。同样清楚的是Swift的语法和语义将改变后的iOS 8。苹果告诉我们,他们不能保证源代码的兼容性,但会提供代码转换器。使用代码转换器的想法让我害怕了一下,我认为迁移到Swift的时间会来得早(iOS的8-9的样子),而不是以后。