作者:cyan 腾讯TEG移动应用部 工程师

6月3日,苹果WWDC14大会召开后,鹅厂的程序猿们不能淡定了。接连出现各种讨论苹果新动向的帖子,这不,一位程序猿GG本着心动不如行动的态度,埋头用Swift和SpriteKit写了2048的程序,被QGQM们称赞“深圳速度”和“碉堡了”。


不懂代码的小编,此次仅扮演大自然的搬运工的角色,纯属复制粘贴,只为了让程序猿们好好欣赏代码之美。


WWDC2014上最让开发者兴奋不已的就是新公开的4000个API和Swift编程语言了吧。有了他们我们可以在苹果提供的生态系统中更方便的做更多事情,码农做应该做第一个吃螃蟹的人,去拥抱变化,所以我在swift发布后兴奋不已,夜不能寐的把他过了一遍。


对待一门新技术我的流程是:
1) 把它大体上浏览一遍;
2) 用它做一个简单东西取悦一下自己;
3) 深入到他的一些细节里面;
4) 做更多复杂的东西。


最后效果是这个样子的:



这篇文章不会去讲一些Swift的语法细节,只是大概提到一下Swift一些另类的地方以及如何把Swift跟原有的CocoaTouch框架结合起来开发一个新纪元的iOS app。关于语法的介绍在苹果开发者网站上是非常详细的,请参考这本The Swift Programming Languange,也可以看一些网上的翻译教程。然后在开发者观望找到一些如何把Swift和CocoaTouch结合起来的的sample code,就可以开工了。

首先用Xcode6新建一个Game项目,语言选Swift:




注意这里选SpriteKit,SceneKit是一个全新的框架,他和Metal融合起来,是OpenGL之外的另一个选择。


然后在入口controller删除多余的代码(示例代码是一个3D的方块),加载主游戏场景。



大体流程是:

MainScene是主游戏场景,实现了界面布局和手势操作的响应。

Chessboard封装了对棋盘上发生的事情,例如移动以及合并。

ChessNode封装了棋子的特征,以及一些动画效果。

所以流程分几步走:

1、在MainScene实现布局,这一点几乎和之前oc的版本完全一样。


objc版本

Swift版本


从这里可以看到objc和swift的一些区别,中括号语法全部变成了点语法,从语法层面上看,你能看到JavaScript/Python/Java的一些影子,这个见仁见智。之前的一些框架已经被完全的用swift重写了(从这一点还是可以看出苹果的诚意的)。有objc经验的开发者能猜到如何从objc转换到swift上来,对于熟悉script类型语言的开发者也可以很快的上手,可以完全不用objc写出iOS/Mac应用,但熟悉Cocoa框架是不可避免的。


但值得一提的是Xcode6目前的状况非常糟糕,代码提示能力很堪忧,所以有些接口只能追踪到各个swift类里面去看,这一点如果苹果不解决是非常可怕的。


2、接下来我们就用类似的方法实现了ChessNode里面的全部逻辑。


objc版本在上一个帖子看(小编注:点击文章最后的“阅读原文”即可查看前一篇文章)


Swift版本


3、下面实现Chessboard里面关于手势的操作,只是提到和之前那个项目截然不同的一点,那就是棋子存储结构变了。


以我目前的了解来看,swift似乎没有数组的支持,集合类array的底层实现不得而知,不过我猜它可能是链式结构实现的,因为当纬度是2的时候检索起来已经有压力了,所以我觉得他应该不是可以随机访问的(不能O(1))。


这里做了一个改动就是把每个棋子起一个名字再放到棋盘中,取的时候用名字拿出来,虽然不及之前那种实现来的方便,不过也不是特别麻烦。



要获得第i行第j列的棋子的时候从父节点里面拿到:


处理棋子的逻辑在此:


自此,objc版本完全移植到了swift,swift之旅第一站到此结束。


总结:Swift是一个很值得尝鲜的东西,他有很多语法糖,或者说短期内他就是objc的一个语法糖。现在学习他确实是一个比较合适的契机,也许很多web开发者也是这么想的。他并不完善,可以看到有很多东西他还是不能完全的在自己的体系内完成,即便他把整个CocoaTouch都做了一次重新封装。在可预见的短期内会掀起一个学习的热潮,会成为其他平台开发者了解苹果的一个机会。长期内是否会打败objc其实要看苹果的热情,如果苹果推动他就成功,否则就是昙花一现,objc不也是一样的情况么?不过我觉得苹果做这么一件事情不会是玩玩而已,具体情况就拭目以待吧,反正多学点东西也并不吃亏。