Swift 在对 Objective-C 改进的 6 个方面 【已翻译100%】

在 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的样子),而不是以后。

时间: 2024-10-02 23:54:19

Swift 在对 Objective-C 改进的 6 个方面 【已翻译100%】的相关文章

Swift 如何实现手势识别 【已翻译100%】

在这次IOS应用开发教程中,我们打算实现手势识别.正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验. 让我们开始吧! 首先需要在Xcode中创建一个新的Single View Application: 然后点击Next,弹出的窗口要求你填写项目设置.在第一栏 ("Product name") 中填入项目名称后,点击Next. 确保语言选择的是 "Swift". 设计界面 点击 "Main.storyboard"

从 Objective-C 到 Swift —— Swift 糖果 【已翻译100%】

Swift带来很多确实很棒的特性,使得很难再回到Objective-C.主要的特性是安全性,不过这也被看成是一种额外副作用. 带类型接口的强型别 Swift有强型别,这意味着除非你要求,不然Swift不会为你做类型之间的转换.所以,例如你无法把Int型赋给Double型.你不得不首先转换类型: let i: Int = 42 let d: Double = Double(i) 或者你必须给Double类扩展一个方法用来转换Int型: extension Double { func __conve

在终端中运行 Swift 程序 【已翻译100%】

在读完苹果开发者文档( Apple Developer Docs)后,我发现: "Xcode的调试器包括一个Swift语言的交互版本,叫做REPL(Read-Eval-Print-Loop)...可以通过Xcode的控制台或终端来访问" 不幸的是,它并没有告诉你怎样从终端访问.好在这也不是什么难事. 输入如下命令即可(无论你用哪个beta,换掉app的名字) alias swift="/Applications/Xcode6-Beta2.app/Contents/Develo

使用 Swift 构建一个 iOS 的邮件应用 【已翻译100%】

在前几个月内,我一直在做InboxKit的研究,它是关于Inbox平台的IOS SDK.Inbox为和邮件数据的交互提供高层API,使得你可以忽略IMAP,Exchange,MIME的解析以及thread探测(当然还有很多其他事情...),并使你致力于完成富有创意的APP的创作上.我们的目标很简单:尽可能地打造一个优雅的,跨提供商的邮件应用.毕竟,它很难. 在Objective-C中,InboxKit使得创建邮件体验变得很轻松,那么,Swift又如何呢?Swift在WWDC后已正式被IOS社区所

swift初探(供objective c开发者参考)

6月初的wwdc苹果推出了一门新的开发语言swift.系统10.9.3以上安装xcode6 beta版即可体验swift. 苹果公司做了尽可能多的努力让这门语言迅速成为一个工业级的实用编程语言,而不是华而不实的花瓶. 通过xcode6查看文档,可以发现之前现存的接口都多了swift适配,举例如下(以下都从苹果官方文档中摘录): 简单方法适配: swift: func UIImageJPEGRepresentation(_ image: UIImage!,                     

全新编程语言 Swift 迎来大幅更新,改进多项功能

苹果全新编程语言 Swift 迎来了大幅更新,开发者可以使用 Swift 编写更好.更安全的应用.新版 Swift 编程语言修正了很多开发者提出的请求.此外,苹果也更新了介绍 Swift 的iBooks 书籍,反映出新变化.

Swift能代替Objective-C吗?_Swift

我文章的中心是,以 Apple 目前给出的各种资料来看,这语言不会替代掉ObjC,它不是下一代的ObjC.它有很多缺点,使得它不足以做大型项目.这些缺点使得,Apple 自己都没有使用它做 Mac/iOS 的 app.我不排除明年后年它有很大改进,但至少现在还没有这端倪. 因此,如果你会ObjC,你不需要去看它. 但你如果问我这语言对普通开发者重要不重要,我说重要,可以明确告诉你这一点--它是 Apple 在 WWDC 向全世界推出的重磅语言我怎麽能说它不重要? 它降低了入门的门槛.使得大量的

Swift中文教程(一) 欢迎来到Swift的世界

Apple凌晨时在WWDC发布了Swift编程语言,语法简介我很喜欢,市面上没有完整的中文教程,我在ibooks里面下载了英文原版,现在开始尝试翻译Swift.我会抽时间坚持原版翻译完,时间有限,不正之处请大家多多指教. 新建了Swifter-QQ群:362232993,同好者进. 第一章:欢迎来到Swift的世界 1,简介 Swift是一款全新的面向IOS和OS Apps的编程语言,建立在C语言和Objective-C语言的基础之上,而且,完美兼容C语言.Swift采用了安全编程模式,增加了许

优雅的开发Swift和Objective-C混编的Framework

前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C如何混合开发Framework,中途发现了很多有意思的坑. 用Swift封装OC的库是一件比较常见的事情,毕竟对于大多数公司来说,老的代码都是用OC写的,而且经过多次迭代,这些OC的代码已经被验证了是稳定的,用Swift重写代价太大.这就引入了一个需求: 用Swift和OC来混编一个Framework. 如果你之前没有用Swift和Objective C混合开发,建议看看这篇文档: Swift and Obj