作者: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 不也是一样的情况么?不过我觉得苹果做这么一件事情不会是玩玩而已,具体情况就拭目以待吧,反正多学点东西也并不吃亏。