本文是我在『移动前线』微信群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的使用。

Whynot React Native?

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

 

Whynot 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语法比较

l 基础语法

l 函数

l struct和class

l Enum

l Interface vsProtocol

l MultiThread

 

3.1基础语法

 

Java

Swift

static final 常量

Java语言没有,Guava库提供

Java支持自增++,自减—

逻辑控制和C基本一致

Java有main方法

Java需要;做行结束符

var 变量,let常量

可选型Optional,通过if let解包

Swift不建议使用,3.0版本将不支持自增

逻辑控制语句更现代

Swift没有main方法

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.3struct 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以后才可以

•       implements

 

•       可以继承

•       protocol可以带有具体实现的方法

•       extension更强大

 

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

Swift 中的扩展可以:

l  添加计算型属性和计算静态属性

l  定义实例方法和类型方法

l  提供新的构造器

l  定义下标

l  定义和使用新的嵌套类型

l  使一个已有类型符合某个接口

需要注意的是扩展方法的作用域问题,这里不展开讨论。

3.6 MultiThread多线程

Java Android

Swift iOS

•       Thread,Runnable

•       Java 5 Concurrency包

•       Android多线程扩展

•       AsyncTask,Looper,HandleThread,IntentService…

•       NSThread

•       GCD

•       NSOperation,NSOperationQueue

 

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

4、Android,iOS UI开发比较

 

Java Android

Swift iOS

•       Xml layout布局

•       直接写xml代码,可视化辅助开发

•       Android可以用Java添加和实现view

•       Intent页面跳转

•       Java自定义view,可以在Activity和layout中使用,可视化支持不够好

 

•       Xib & StoryBoard

•       AutoLayout和SizeClass,IB自动生成,代码合并困难;

•       很多团队只好用代码实现UI界面

•       Segue连线跳转

•       自定义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

•       OKHTTP

•       Volley

•        

•       Retrofit + RxAndroid

 

•       Moya   

•       Alamofire

•       AFNetworking

•        

•       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,目前插件还很比较少。


更多相关文章

  1. 提升Android应用开发性能的十大要点(1)
  2. 步入Android江湖 有你才会更精彩
  3. Android面试宝典(一位优秀应届生面试经验,很多Android高阶问题)
  4. 修改Android的编译文件使其支持wml
  5. 认识AndEngine选自Android(安卓)2D游戏引擎AndEngine快速入门教
  6. 我是如何自学 Android(安卓)的?
  7. 【麦子学院】攻克安全漏洞,协助Android前行
  8. 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Stud
  9. iOS、Android开发应用设计十建议

随机推荐

  1. Android(安卓)仿小米优品单行输入Dialog
  2. android listview 滑动监听
  3. Android(安卓)之 监控手机电量
  4. Android(安卓)VideoView播放视频
  5. Android(安卓)Camera ShutterSound custo
  6. android 事件
  7. 判断Android的网络状态
  8. Android软键盘用法实例
  9. android获取解析GPS数据
  10. Android自定义view二Banner