从Java/Android到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. WhyFrom Java/Android to Swift
  2. Swift语言为什么值得学习?
  3. Javavs Swift语法比较
  4. Android和iOS UI开发比较
  5. Androidvs 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
    使用例子:
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,目前插件还很比较少。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,498评论 25 707
  • 就你
    溜溜白阅读 157评论 0 0
  • 飞机上免费提供饮料这是尽人皆知的,但你不知道的是当你选不同饮料的时候给人的感觉是不一样的。好好回想下,有没有感觉只...
    赵莲贵阅读 915评论 1 1