在 Atomic Object 的安娜堡办公室,我们做了一个观看2014年的WWDC主题演讲,毫不夸张地说,当Swift宣布的时候,我们感到十分激动。Swift,苹果正在推进的一个更现代的编程语言。我很高兴能获得先机并开始用它开发。
在这篇博文中,我将重点介绍Swift的几个语言特性,这将使开发者的工作更加轻松。
Objective-C 和 Core Foundation 对象相互转换的内存管理总结
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>
当在类中声明一个实例函数时,如果他们覆盖了一个基类函数,他们必须标记为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