Swift初探

在前几天的WWDC上,Apple宣布了Swift这个新的编程语言。花了一点时间读了点文档玩了会儿,总结下一些值得一提的地方。因为也是刚刚接触,如果哪里有错,还请悉心指出。

  • 类型推导:既然Swift作为编译时静态的语言,大部分时候就可以由编译器推断出变量类型,于是比如就可以用var关键字来声明变量以减少拼写,增加代码的可读性。当然,在编译器无法推断出类型的时候,还是需要显示声明对象的类型。

  • 可变字符串:在JAVA/C#里,字符串默认是不可变的,即对于一个字符串对象进行修改,都会创建一个新的字符串对象,而在Swift,如果是声明的变量就可以直接对其内容进行修改。

  • ..来表示一段范围:这个跟Ruby类似,比如循环就可以这样表达:for i in 0..3

  • 多个返回值:跟C#的Tuple类似,不过一般来讲在OOP里,如果需要用到多个返回值的情况,很有可能是设计不当,没有用一个类型来封装这些返回值。但又不得不承认有时候的确这样也会比较方便。

  • 枚举类型:这次Swift的枚举类型功能强大,不仅支持Int和字符串,还支持任意类型的枚举,甚至Swift里的Optional类型也是建立在枚举类型上的。具体可以查看文档的Enumerations章节

  • 闭包:即Clousure, 也就是Lambda表达式/匿名函数/Block,无需多说了。

  • Protocol:或许对于Objective-C程序员来讲并不陌生,但其实也就是OOP里的接口。

  • 结构体和类(Struct and Class):跟C#类似,结构体一般被内存分配在栈上,而类在堆上,结构体值传递,类则引用传递。

  • 属性:跟C#类似,由编译器来生成类型的成员以及getter/setter,不过Swift在属性上还有Observer来反应值的改变。

  • 泛型:是类似C#的真泛型,不像JAVA的泛型,总是需要装箱拆箱,没有很强的类型安全,性能也相比较差。作为一门新的语言,不用考虑向后兼容,这点也是应该的。:p

  • dynamicType:Swift是编译时静态运行时动态的语言,即有些类型在运行时才确定,具体可以看文档的Dynamic Type Expression这一章节。

  • 扩展方法:跟C#类似,可以自由地扩展类型,只是语法上比C#更简洁一些。

  • Optional:就是C#里的Nullable,因为有些类型本身不支持nil的赋值,所以如果在这类类型声明的时候加上?即声明了一个optional value,比如var a: Int? = nil,这样value就是一个初始值为空的Int?类型。有些人会问那不如直接初始值赋为-1好了。但是既然给一个变量赋了一个值,就代表这个值对于程序的上下文是有意义的,而把这个变量设为nil就代表这个变量在这段程序里是暂时没有意义的。另外有了Optional之后,由于每次都需要检查是不是nil会造成if-else语句的层叠影响代码可读性,Swift的Optional Chaining就很好的解决了这个问题。

  • weak和unowned关键字来表达这种情况,以便编译器在合适的时候生成代码回收对象。

总的来说,现代语言该有的Swift都包含了进去,使得写代码效率提高很多,代码也更加易读。这一点上我还是很兴奋的。至于所谓的坑,其实只是语言设计时候的各种取舍。比如JAVA的泛型之所以这么设计就是为了向后兼容,而当C# 2.0推出泛型的时候,就不考虑这一点。再比如Swift的Optional最近就一直让人很困惑受到很多人的吐槽,典型的比如这条推里写的,其实就是没有理解Optional。这条推里的代码声明了一个Optional的变量并且赋了有意义的值,却没有弄明白在if语句里判断这个变量其实是判断这个Optional的变量是不是nil,而不是判断这个变量的值(因为可能这个变量根本没有值)。

至于学习,最好的办法就是照着文档写代码了。目前官方主要有The Swift Programming LanguageSwift Standard Library ReferenceUsing Swift with Cocoa and Objective-C。而这次WWDC里也有很多session是介绍Swift的,还涵盖了文档里没有介绍的一些东西,非常值得一看。全部的视频都已经在上传到了WWDC14的网站。另外有不懂的,也可以去Stackoverflow的swift-language标签下问问题或者看看别人的回答。

以上说的这些,只是基于还在pre-release的文档,所以还会有变化,但初看下来Swift是一门设计得不错的语言。尽管现在看上去只是为了开发iOS和OS X软件服务的,个人觉得不久之后或许就是一门general purpose的语言,因为这门语言本身是有这样的潜力的。另外还希望苹果能开源与Swift相关的工具,比如编译器、REPL等等。C#的编译器都开源了,厨子!

最后引用Swift的设计者Crhis Lattner的一条推:

Xamarin Evolve 2013

不久前,Xamarin在德州Austin举办了第一次他们自己的程序员会议,但是因为各种原因我没法现场参加。而且由于时差的问题,也错过了keynote和很多session的现场直播。

今天,Xamarin终于把第一天的keynote发布了出来。在keynote里,介绍了Xamarin从成立到现在的一些有趣的故事,进军移动领域的原因,他们CTO Miguel是如何从Linux粉转向果粉的,Xamrin 2.0的介绍,F#和Async开始beta测试,新的内嵌iOS designer,以及新产品Xamarin Test Cloud。Keynote地址在这里:Xamarin Evolve 2013

重点提下Xamarin Test Cloud,这是一套自动化UI测试(Automated UI Testing)框架。因为在iOS有几个版本,还有几个不同的设备,测试会变得很繁琐。在Android平台上这个情况更加严重,不仅版本众多而且还有两三千种不同的设备。面对这么繁多的设备,在所有真机上测试你的程序变得几乎不可能。在我实际Android开发的时候就碰到过这种情况,说得夸张些就是几乎每增加一个测试的真机就会出现一个新的问题。而Xamarin Test Cloud正是想解决这个问题。目前提供他们web app,可以上传你的程序的apk(Android)或者ipa(iOS)文件,选择想要的机型然后开始测试。当然,除了web app,也有API可以嵌入到你自己的开发过程当中。

Xamarin Test Cloud

既然叫Automated UI Testing,手工点app上的各种按钮,填写各种文本框等等这类根本算不上自动化测试。Xamarin Test Cloud最令我激动的是提供了一套脚本来自动化这些测试,比如定义脚本来进行“打开app->输入用户名和密码->点击登录按钮”这样的一系列操作,然后就可以在各个设备上看到跑这个脚本的情况,多少通过了,哪些有crash,crash的话就会有相应的log,哪些反应比较慢就会给出警告,非常方便和使用。最后提一点,Xamarin Test Cloud是适用于所有Android/iOS app的,并不仅限于用Xamarin写的app。

除了keynote,会议的session部分也即将上线,非常期待。一些有意思的session更新后,我会在这里及时更新。

Xamarin 2.0

之前几个礼拜就收到邀请参与private beta的测试,今天,Xamarin终于发布了他们移动跨平台工具的新版本:Xamarin 2.0。这里略微的介绍下我比较感兴趣的新功能。

  1. 新的IDE:Xamarin Studio 
    Xamarin Studio的前身是MonoDevelop,一款用于在Linux/MacOS/Windows下写C#应用程序的IDE。新版本主要重新设计了UI,之前时不时会有问题的代码完成也有了巨大的改进以及全局搜索等等。官方blog里详细地介绍了这些改进是怎么来的。

    Xamarin Studio
    Xamarin Studio
  2. 在Visual Studio里开发iOS应用
    以前,这也是可行的,但是需要很多的弯路要走,也不是很稳定。这次官方总算加入了这个功能。他们的办法是通过网络与另一台Mac来传输编译调试所需要的信息。这个功能非常实用,因为Visual Studio是套非常强大而且完善的IDE,而且也还有另外一个杀手锏:ReShaper,能极大地增加开发效率。
  3. 新的价格
    新的版本也带来价格的变化。这次加入了有app体积限制的免费版本,降低了独立开发者和企业级的价格。不过对我来说,独立开发者这一档没有Visual Studio支持还是蛮令人扫兴的,毕竟VS上有ReShaper这个神器。

    Xamarin Pricing
    Xamarin Pricing

别的改进还有很多,比如多了个组件商店,可以下载(有的收费)一些组件拿来直接用,避免时间浪费在重复造轮子上。这里有篇非常详细的上手体验介绍,感兴趣的可以去看。

关于跨平台开发,势必会带来的一个问题就是,许多功能其实只是在不同环境/语言下的再实现,那这样的重复造轮子是否值得?或者说有没有这样一种工具或者语言能简化这部分的开发过程?

答案是有的。比如像PhoneGap这样,用你最喜欢的框架写个适合移动设备的web app,然后用各平台自带的浏览器控件包装一下。这样的好处就是只需要写一个web app就能在各个平台上跑,效果也都一样,开发时间又短,但显而易见的主要问题就是性能不好、依赖于当前平台浏览器控件所能支持的系统API以及需要实时在线。

为了解决这些问题,又有了类似像Titanium这类叫做hybrid app的新办法。就是提取出各个平台公共的UI控件以及API,再配合上web app,整合成一个app。好处就是相比之下性能会好一些,应用合适的数据存储方式后并不需要实时在线,但仍然运行起来不是很流畅,不能方便地调用系统API,所能提供的API也不全。

而Xamarin则走了一条不一样的路。上述两种方案的首要问题就是一个移动应用是否真的必须在每个平台上的设计和操作一模一样?他们认为,不需要,每个平台都有其独特的UI,比如像他们CTO Miguel在MIX11会上所示范的:Mono UI

既然如此,那不如在UI层上使用各个平台原生的控件,而业务逻辑层数据层则共用一套代码。这样既做到了拥抱各个平台原生UI的独特之处,又最大程度地共享代码加快开发效率。

此外,他们选择了C#这个非常强大又高效的语言,比如这些杀手级feature:LINQ, Lamda表达式,var匿名类型等(JAVA?!)。再通过P/Invoke实现每个平台上所有API的绑定。由于C#及其虚拟机CLI(Common Language Infrastructure,即.Net的核心部分)加入了ECMA标准,于是他们脱离微软自己实现了这些。当然也不用担心版权纠纷

那最后的性能到底如何呢?试试看像Bastion这样的游戏,或者iCircuit这样的跨平台应用,以及我最爱的云音乐软件Rdio就知道了。:)

所以,如果想要每个平台达到最好的用户体验又要最大程度地共享代码,Xamarin的这套移动开发平台可能是最好的选择。

新晋小果粉的WWDC 2011前瞻

再过几个小时就是一年一度的苹果开发者大会(World Wide Developer Conference)。

wwdc11_hero_full

作为一名新晋小果粉,稍微说下我的期待。

  • iOS5:从第一代iPhone发布开始,每年iOS随着iPhone硬件的升级而升级。但这次,我觉得硬件上的升级不会有像去年显示屏升级成Retina Display那么犀利那么杀手级,所以,如果乔布斯想要在iOS上“Change the world.“的话,我希望是整套iOS的UI能彻底焕然一新。
  • iCloud:太多太多的rumor说苹果会发布自己的云计算平台之类的什么什么。当然,iCloud也一定会跟在线音乐有关。不过乔布斯那口风紧的,所以我猜那些rumor都还是小打小闹,真正能”Change the world.“的还得看明天他自己的揭秘。此外,还很关心iCloud对于代码工而言意味着什么。
  • Back to school:嗯。等这个很久了,就看今年的促销力度如何。之前的rumor说依旧买mac送iTouch,但是也可能会有买mac买iPad折价200美元的促销。拭目以待,再说,我等不及想用mac了。Smile with tongue out
  • iPod Classic:我又开始唠叨了!的确,自从几年前自己音乐库容量越来越大之后,每次苹果一开发布会,就念叨着苹果可以升级下iPod Classic。当然,这次肯定也不例外,继续希望能看到升级版的iPod Classic,哪怕只是从160Gb升级到250Gb也好的。有的人会质疑这东西都没人买了,其实错了,这东西目前仍雄踞amazon MP3播放器销量榜的第3名

总之,明天关注@MacRumorsLiveEngadget的现场直播,1pm EST!