技术控眼里的Swift语言:谁说0基础?_最新动态_新闻资讯_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 新闻资讯 > 最新动态 > 技术控眼里的Swift语言:谁说0基础?

技术控眼里的Swift语言:谁说0基础?

 2014/6/19 23:12:18    程序员俱乐部  我要评论(0)
  • 摘要:知乎ios开发黄兢成:有些人学Swift语言特别快,因为之前的基础好。语言的语法只是表面,表面的东西总是变动得比较快的。底下的东西重要得多,而看不见,说它0基础的人完全菜鸟。swift跟objc共用同一套的运行时环境swift的类型,可以桥接到objc的类型,反之亦然。如string对应原来objc的NSString,closures对应objc的block,等等。objc积累下来的大量库,实现不用改写,swift就直接可以使用。(最多加个声明文件)。看两个API的声明,对比一下
  • 标签:技术

技术控眼里的 Swift 语言:谁说 0 基础?

  知乎 ios 开发黄兢成:有些人学 Swift 语言特别快,因为之前的基础好。语言的语法只是表面,表面的东西总是变动得比较快的。底下的东西重要得多,而看不见,说它 0 基础的人完全菜鸟。

  swift 跟 objc 共用同一套的运行时环境

  swift 的类型,可以桥接到 objc 的类型,反之亦然。如 string 对应原来 objc 的 NSString, closures 对应 objc 的 block,等等。objc 积累下来的大量库,实现不用改写,swift 就直接可以使用。(最多加个声明文件)。

  看两个 API 的声明,对比一下:

objc
void
dispatch_apply (size_t iterations, dispatch_queue_t queue,
void (^block)(size_t));
- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *)event;
swift
func dispatch_apply (iterations: UInt, queue: dispatch_queue_t!, block: ((UInt) -> Void)!)
func touchesBegan (touches: NSSet!, withEvent event: UIEvent!)

  我怀疑,swift 中的接口文件,是利用原来 objc,c中的接口文件自动程序生成的。同一个工程,可以同时使用 swift, objc, c, c++ 四种编译语言(额外嵌入的脚本语言另算),原来的 iOS/Mac 工程,已经可以同时使用 objc, c, C++三种语言。现在支持第四种。objc, c, c++ 三种语言的结合很容易, objc 跟c本身就兼容,objc 跟c++结合只要将文件名改成 .mm。而 swift 跟其它语言的结合,需要另外的文件进行桥接,其实也挺方便的。

  这里的桥接很容易,Apple 自家的各种 C 库移植过来了。比如 Core Image/Audio,直接包含

import CoreAudio
import CoreImage

  就可以使用了。

  现在 swift 完全可以跟 objc 并存,原来的工程不建议重写,也不用重写。顺其自然,慢慢让它进化就是了。

  swift 写法看起来像脚本语言,但它是真正的编译语言

  初学者,看它使用了

let a = 4
var b = "hello"

  没有类型定义,就想当然的觉得它是脚本语言,解释执行,这是错误的。上面两行语句是用了类型推导,类似 C++ 里面的 auto。swift 跟 objc 的运行时环境一样,写的程序跑起来不会比 objc 慢。swift 区分了 struct 和 class, 分别使用传值跟传引用。适当地使用 struct,应该会比 objc 要快一点。swift 吸收了很多其它语言的语法,写起来比 objc 简洁得多,不过它骨子里面的概念,跟原来 objc 差不多。

  编程语言的语法重要,但是语法背后的概念更重要

  比如面向对象,常用概念无非是,继承,多态,封装,信息隐藏等。继承又可能分成多重继承,接口继承,实现继承。或者还会有些嵌套类,嵌套函数等等。当明白语法背后的概念,知道为什么需要有这些东西。之后从一门语言切换到另一门有着相同概念的语言,其实很容易。

  而语法会影响表达,理论上每门语言都可以表达任何概念。不过当某种概念在某门语言中,很难表达出来,就会倾向于不这样使用它,这种概念在那门语言的社区就难以被人熟知。

  感觉上,swift 有着 obj-c, C++, Ruby 的影子。

  最喜欢的 3 个特性

  tuple,终于可以返回多个数值了。一行交换两个值。C++里面的 tie+tuple 也可以实现类似功能,不过使用库,显得噪音太多。

  closure,喜欢它的简写,还有在函数最后一参数,可以写在()外面。这些特性,用来写函数式风格的程序,会很好看。而原来 objc 的 block, 还有c++的 function, 就太啰嗦了。

  switch,case 里面的条件匹配。

  这些语法,编译最后还是会映射成原来 objc 的运行模型。原来 objc 的概念,引用记数,ARC, 属性,协议,接口,初始化,扩展类,匿名函数等等,继续有效。

  swift 是 objc 的一块大大的语法糖

  有个大块头的东西,是原来 objc 没有的,就是泛型。swift 中将那种操作写一次,就可以作用多个类型的语法叫做 generics(泛型),而 C++ 中称为 template(模板),叫法不同,本质是同样的东西。总的说来,swfit 涵盖了现在流行的编程方式,结构化,面向对象,泛型,函数式。

  swift 的新语法,可以很好地支持内部 DSL

  有一种编程风格,不太好归类。就是将程序拆分成,描述+解释。解释部分写一次,其它地方使用描述式的语句,而不是命令式的语句。内部 DSL,通常利用主语言的语法特性,创出一套写法,来写一些描述性的语句。这些语句组合起来,就像一门新语言似得。这个比较难理解。举个例子(从 ruby 那里借过来的),假如计算,几小时之后的秒数。C语言中,大概会写成

getHourSeconds (3)

  而现在 swift 中,只要定义了扩展

extension Int
{
var hours:Int
{
return self * 3600
}
var ago:Int
{
return -self
}
}

  就可以写成

3.hours
3.hours.ago

  分别是 3 小时后的秒数,3 小时前的秒数。

  同理,也可以写成

10.days
10.days.ago

  这种写法,看起来跟原来的命令式写法完全不同。这些程序是描述性的。原来的 objc, 做不到这点。 我估计 swift 以后会冒出大量这样风格的库。

  这种风格,到底好不好,要看情况。比较方便定义内部 DSL 的语言, 我自己知道的有C++, Ruby, Lisp。现在多了 Swift。

  认为所有人都是 0 基础的,是错误的

  有些人学得特别快,因为之前的基础好。语言的语法只是表面,表面的东西总是变动得比较快的。底下的东西重要得多,而看不见。水面一块冰,有些人是冰山露出一角,有些人是无根的浮冰。看起来差不多,其实差别十分之大。

  我相信有些人,在两个小时之内就可以使用这门新语言。

  提提那个 Playground

  之前苹果的员工,Bret Victor 演讲过个视频。提到这个这种可视化编程。当我们每一步操作,都得到实时地反馈,我们的做法会有很多不同,做出的东西也会不同。这个 Playground,用来学习 swift 的特性很好用,不过我还不知道怎么才能跟工程结合起来使用,不作评论。

  现阶段,我自己的做法

  我自己写的新项目,将会有一部分使用 swift 来编写。但还是会以 objc 为主。发觉现在 Xcode 6 beta 版本,对 swift 的语法提示支持不好,不能打几个字母就自动完成。再观察一阵子。我不敢展望太多,或者预测什么,通常提前预测都是错的,会让人抓住把柄。但感觉 Apple 发布 swift, 绝不是玩玩而已。

发表评论
用户名: 匿名