从JavaAndroid到Swift iOS开发:语言与框架对比

本文是我在『移动前线』微信群2016年4月28日的分享总结整理。
我从2009年开始做Android开发,开始接触Swift是在2014年底,当时组里曾经做过一个Demo App,感觉技术还不够成熟没有正式发布。2016年初我们正式使用swift开发上线了销售助手App产品,积累了比较丰富的swift项目实战经验,开源框架都是用的swift版本,大量使用了面向协议和函数式编程。iOS App开发人员基本都是以前安卓版本的开发人员,同时维护安卓和iOS 2个版本,效率很高。

今天分享的主题是Java/Android开发人员如何快速上手Swift iOS开发。主要内容如下:

  1. Why From Java/Android to Swift
  2. Swift语言为什么值得学习?
  3. Java vs. Swift语法比较
  4. Android和iOS UI开发比较
  5. Android vs. Swift iOS框架比较
  6. 开发工具比较

1、Why FromJava/Android to Swift

成本和效率

由于目前同业务的Android和iOS App产品功能一致,由一个团队开发可以降低业务同步和沟通成本,避免安卓和iOS两个团队带来的产品功能差异和沟通成本。

Swift语法更接近Java,相对Objective C上手容易,我2012年曾经带过iOS项目,学过oc,因为无法忍受oc奇怪的语法最后放弃了,但这次学习swift iOS过程还是挺顺畅的,学习的主要门槛反而是Xcode IB的使用。

Why not React Native?

ReactNative我们也要项目在用。但RN思想和语法的学习曲线有些陡,很多有Web开发经验的人都不一定喜欢。另外很多安卓开发者并没有学习过js,学习React Native成本会比较高。学习React Native最终还是要对原生开发有一定的了解。最后,在一些功能复杂的App,React Native用户体验比不上原生 。

Why not HTML5 Hybrid App?

用户体验不够好,对于不熟悉Web开发的工程师学习成本比较高。
2014年我们用ionic框架做过混合App,在iOS上效果可以,但在安卓低端机上比较卡,影响用户体验。

2、Swift语言为什么值得学习?

Swift是现在Apple主推的语言,2014年新推出的语言,比Scala等“新”语言还要年轻10岁。2015年秋已经开源。目前在linux上可用,最近已经支持Android NDK;在树莓派上有SwiftyGPIO库,可以通过GPIO控制一些硬件。
ObjectC is old and ugly,oc是1983年苹果推出的,过于陈旧和臃肿。
Swift语法类似Scala,Javascript ES6, Java,OC, C++, Python,这个我是按照语法相似度排序的。
Swift支持多范式编程:面向协议,面向对象和函数式编程 。
最后,我们还可以通过Swift学习函数式编程思想,这块Java8才支持。

3、Java vs. Swift语法比较

  • 基础语法
  • 函数
  • struct和class
  • Enum
  • Interface vsProtocol
  • MultiThread

3.1基础语法

Java Swift
static final 常量 var 变量,let常量
Java语言没有,Guava库提供 可选型Optional,通过if let解包
Java支持自增++,自减— Swift不建议使用,3.0版本将不支持自增
逻辑控制和C基本一致 逻辑控制语句更现代
Java有main方法 Swift没有main方法
Java需要;做行结束符 Swift不需要行结束符

Swift的switch 语法和Java及C++很像,但是它没有break,他命中一个case后会自动退出switch。对于几个不同case同样处理的情况,可以case后面连续几个condition,用逗号隔开。
for循环和Java也基本一样,不过也是不需要括号。for循环中,..<的用法比较方便。下划线符号_(替代循环中的变量)能够忽略具体的值,并且不提供循环遍历时对值的访问。for-in则有点类似与Java中for each循环。
Swift 2.2中trycatch和do while和java差异很大

3.2 函数和闭包

Swift函数的定义和Java很不一样,Swift函数的定义形如 func foo(arg: Type) ->Return Type:
Swift中函数是一等公民,可以作为返回值和参数;Swift支持闭包,Java8才支持lambda闭包。
Swift支持元组,Swift函数可以通过返回元组支持多个返回值。
Swift函数可以嵌套,即一个函数内部还可以定义函数,Java不支持。
Swift函数可以接收不定参数,跟Java基本类似
Swift函数参数可以带默认值,和Python类似,Java函数不可以带有默认值。
常用的函数式编程方法map,reduce, flatMap,filter,sort,相对于理解抽象的函数式编程概念,我觉得开始时先用好这些函数更重要。

3.3 struct vs. class

struct是值类,class是引用类型,Java语言没有struct,但c/c++/c#语言都有。
Swift开发推荐使用struct,而不是class。Swift语言实现包括几百个struct,只有几个class。
Swift类构造方法是init(),析构方法是deinit(),类方法调用跟Java基本一样。
self相当于Java中的this,传入生命周期不一致的闭包时需要声明为weak。

3.4 Enum枚举

Android开发谷歌官方不建议使用Enum,影响性能。
Swift的Enum和Java类似,本质是一个类,里面可以包含函数。
SwiftEnum语法更简单。
SwiftEnum支持扩展extension。

3.5 Interface vs. Protocol

Java Interface Swift Protocol
可以继承 可以继承
Interface不能带有具体实现的方法,Java8以后才可以 protocol可以带有具体实现的方法
implements extension更强大

Extension扩展就是向一个已有的类、结构体或枚举类型添加新功能(functionality)。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和 Objective-C 中的分类(categories)类似。
Swift 中的扩展可以:

  • 添加计算型属性和计算静态属性
  • 定义实例方法和类型方法
  • 提供新的构造器
  • 定义下标
  • 定义和使用新的嵌套类型
  • 使一个已有类型符合某个接口
    需要注意的是扩展方法的作用域问题,这里不展开讨论。

    3.6 MultiThread多线程

Java Android Swift iOS
Thread,Runnable NSThread
Java 5 Concurrency包 GCD
Android多线程扩展 NSOperation,NSOperationQueue
AsyncTask,Looper,HandleThread,IntentService…

iOS的多线程相对Java来说比较简单,GCD一天时间基本就能够弄明白。Java的Concurrency包就比较复杂了。

4、Android,iOS UI开发比较

Java Android Swift iOS
Xml layout布局 Xib & StoryBoard
直接写xml代码,可视化辅助开发 AutoLayout和SizeClass,IB自动生成,代码合并困难;
Android可以用Java添加和实现view 很多团队只好用代码实现UI界面
Intent页面跳转 Segue连线跳转
Java自定义view,可以在Activity和layout中使用,可视化支持不够好 自定义View可以使用IBDesignable & runtime attributes

iOS开发苹果官方建议使用Storyboard开发UI,好处是比较直观,通过看界面可以更好的理解和维护App。现在Xcode7版本对AutoLayout和SizeClasses的支持越来越好,多分辨率适配变得简单,建议大家放弃使用frame代码写界面的传统做法。
当然,Storyboard也有下面的弊端:
界面主要依靠IB生成,Xib代码难以维护,Xcode打开Storyboard或Xib就会对文件产生修改,即使我们没有做实际的修改,git也会显示文件修改了。
多人协助,同时修改导致冲突,合并困难。
Storyboard中包含页面多了后会占用了太多内存,导致Xcode卡顿和崩溃。
错误定位困难,错误提示不清晰,新手难以定位错误。例如不小心删掉了IBOutlet会很难定位。

Storyboard UI 开发实践

按照业务模块分成多个Storyboard,每人负责的模块避免交叉。
每个storyboard不要超过10个页面,可以通过Refactor Storyboard功能重新划分。
用Container在一个storyboard复用UI模块,用xib在多个storyboard复用UI模块。
复杂的输入表单,建议用SwiftyForm框架写代码。

5、Android vs Swift iOS框架比较

Swift框架现在已经很多了,Swift也可以使用OC开源框架,但不推荐使用。我们主要对比介绍项目常用的网络请求框架,JSON解析和图片缓存框架

网络请求框架

Java Android Swift iOS
Retrofit Moya
OKHTTP Alamofire
Volley AFNetworking
Retrofit + RxAndroid Moya + RxSwift

在Android开发现在一般使用OKHTTP,Retrofit和Volley等网络框架进行开发,iOS开发oc时代使用AFNetworking库开发,swift开发推荐使用Alamofire和Moya库。
Moya 对Alamofire网络请求库进行了封装,开发不需要写网络模型,管理等。使代码更加简洁。Moya可以代替自己编写的网络抽象层APIManager。Moya提供了一些很好的特性:
编译期检查API接口调用的正确性
通过enum枚举类型清晰的定义不同API的接口
把接口测试stub作为一等公民,让单元测试变得很简单。
支持ReactiveX扩展,方便和RxSwift集成。

目前App基本都是使用JSON作为报文协议,Android开发我们一般使用Gson进行解析,在Swift开发中,对比了ObjectMapper,Argo+Curry,SwiftyJson后,我们* 决定使用ObjectMapper作为JSON解析框架。ObjectMapper支持的特性如下:

  • 支持把对象转换成JSON,把JSON转换成类对象
  • 支持嵌套的对象(单一对象,对象列表集合和字典)
  • 支持自定义的转换函数
  • 支持结构体struct
  • 支持Realm和Alamofire集成,AlamofireObjectMapper
    使用例子:
1
2
let user = Mapper<User>().map(JSONString)
let JSONString = Mapper().toJSONString(user, prettyPrint: true)

Realm是iOS开发比较流行的针对移动端设计的数据库,代替sqlite,也有Android版本
图片缓存框架,Android开发常用Glide和Fresco,OC开发一般用SDWebImage,Swift开发推荐用HanekeSwift。

6、开发工具比较

Android目前主流的开发工具是Android Studio,2014年以前是Eclipse ADT。

iOS开发一直使用Xcode。对于Java/Android开发人员来说,Xcode上手较难,特别是Interface Builder,Xib和视图代码直接通过连线来生成事件方法,比较挑战开发习惯,并且出现问题定位困难。而Android开发者习惯手写xml界面代码。

与Android Studio相比,Xcode速度快,但不够稳定,一天崩溃几次很正常。

模拟器方面,Android的Emulator是虚拟机,启动和安装速度比较慢,iOS是Simulator,速度快,但有些功能不能模拟。都推荐使用真机进行开发。

包管理器&构建工具对比

Android开发早期用Ant做一些任务处理,后面有些团队借鉴Java EE项目的做法用Maven,AndroidStudio出现后谷歌推荐用Gradle。Android的构建工具比iOS功能要强大很多。
iOS开发早期用CocoaPods,现在推荐用Carthage,未来Apple官方推出Swift3.0后会推广官方的Swift Package Manager。
最后介绍下Xcode包管理器Alcatraz,主要提供Xcode插件,模板和色彩模式,相比Android Studio,目前插件还很比较少。

Contents
  1. 1. 1、Why FromJava/Android to Swift
    1. 1.1. 成本和效率
    2. 1.2. Why not React Native?
    3. 1.3. Why not HTML5 Hybrid App?
  2. 2. 2、Swift语言为什么值得学习?
  3. 3. 3、Java vs. Swift语法比较
    1. 3.1. 3.1基础语法
    2. 3.2. 3.2 函数和闭包
    3. 3.3. 3.3 struct vs. class
    4. 3.4. 3.4 Enum枚举
    5. 3.5. 3.5 Interface vs. Protocol
    6. 3.6. 3.6 MultiThread多线程
  4. 4. 4、Android,iOS UI开发比较
    1. 4.1. Storyboard UI 开发实践
  5. 5. 5、Android vs Swift iOS框架比较
    1. 5.1. 网络请求框架
  6. 6. 6、开发工具比较
    1. 6.1. 包管理器&构建工具对比
,