Android &Swift iOS开发:语言与框架对比

转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_source=infoq&utm_medium=articles_link&utm_content=link_text前端

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

我从2009年开始作Android开发,开始接触Swift是在2014年末,当时组里曾经作过一个Demo App,感受技术还不够成熟没有正式发布。2016年初咱们正式使用swift开发上线了销售助手App产品,积累了比较丰富的swift项目实战经验,开源框架都是用的swift版本,大量使用了面向协议和函数式编程。iOS App开发人员基本都是之前安卓版本的开发人员,同时维护安卓和iOS 2个版本,效率很高。 今天分享的主题是Java/Android开发人员如何快速上手Swift iOS开发。主要内容以下:java

  1. Why From Java/Android to Swiftlinux

  2. Swift语言为何值得学习?android

     
  3. Java vs Swift语法比较ios

  4. Android和iOS UI开发比较c++

  5. Android vs Swift iOS框架比较git

  6. 开发工具比较sql

Why From Java/Android to Swift

成本和效率方面,因为目前同业务的Android和iOS App产品功能一致,由一个团队开发能够下降业务同步和沟通成本,避免安卓和iOS两个团队带来的产品功能差别和沟通成本。数据库

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

Why not React Native?

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

Why not HTML5 Hybrid App?

用户体验不够好,对于不熟悉Web开发的工程师学习成本比较高。

之前咱们用ionic作过混合App,在iOS上效果能够,但安卓低端机上比较卡,影响体验。

咱们如今也有App是React Native作的,大概是去年11月上线的,用户体验还不错,但开发人员基本上是之前的前端开发。

Swift语言为何值得学习?

Swift是如今Apple主推的语言,2014年新推出的语言,比Scala等“新”语言还要年轻10岁。2015年秋已经开源。目前在linux上可用,最近已经支持Android NDK;在树莓派上有SwiftyGPIO库,能够经过GPIO控制一些硬件。 Object C is old and ugly,oc是1983年苹果推出的,过于陈旧和臃肿。

Swift语法相似Scala,Javascript ES6, Java,OC, C++, Python, 这个我是按照语法类似度排序的。

(Redmonk和TIOBE的语言排行榜,Swift都榜上有名)

Swift比Scala、Clojure等语言还有年轻不少年。

Swift支持多范式编程:面向协议,面向对象和函数式编程。最后,咱们还能够经过Swift学习函数式编程思想,这块Java8才支持。

Java vs. Swift语法比较

基础语法

Swift的switch 语法和Java及C++很像,可是它没有break,他命中一个case后会自动退出switch。对于几个不一样case一样处理的状况,能够case后面连续几个condition,用逗号隔开。

for循环和Java也基本同样,不过也是不须要括号。for循环中,..<的用法比较方便。下划线符号_(替代循环中的变量)可以忽略具体的值,而且不提供循环遍历时对值的访问。for-in则有点相似与Java中for each循环。

Swift 2.2中try catch和do while和java差别很大。

函数和闭包

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,相对于理解抽象的函数式编程概念,我以为开始时先用好这些函数更重要。

struct vs. class

struct是值类,class是引用类型,Java语言没有struct,但c/c++/c#语言都有,但不能带方法。

Swift开发推荐使用struct,而不是class。Swift语言实现包括几百个struct,只有几个class。

Swift类构造方法是init(),析构方法是deinit(),类方法调用跟Java基本同样。

self至关于Java中的this,传入生命周期不一致的闭包时须要声明为weak。

Enum枚举

Android开发谷歌官方不建议使用Enum,影响性能。

Swift的Enum和Java相似,本质是一个类,里面能够包含函数。

Swift Enum语法更简单。

Swift Enum支持扩展extension。

Interface vs. Protocol

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

Swift 中的扩展能够:

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

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

  • 提供新的构造器

  • 定义下标

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

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

Swift 中的扩展很强大,struct class enum均可以,也能够扩展系统的类。须要注意的是扩展方法的做用域问题,这里不展开讨论。

MultiThread多线程

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

Android,iOS UI开发比较

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框架写代码。

使用Size Classes作多分辨率适配比较轻松。

Android vs Swift iOS框架比较

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

在Android开发如今通常使用OKHTTP,Retrofit和Volley等网络框架进行开发,iOS开发oc时代使用AFNetworking库开发,swift开发推荐使用Alamofire和Moya库。

Moya 对Alamofire网络请求库进行了封装,开发不须要写网络模型,管理等。使代码更加简洁。Moya能够代替本身编写的网络抽象层APIManager。Moya提供了一些很好的特性:

  • 编译期检查API接口调用的正确性

  • 经过enum枚举类型清晰的定义不一样API的接口

  • 把接口测试stub做为一等公民,让单元测试变得很简单。

  • 支持ReactiveX扩展,方便和RxSwift集成。

  • Moya比Android Retrofit 多了模拟数据调试的功能。

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

  • 支持把对象转换成JSON,把JSON转换成类对象

  • 支持嵌套的对象(单一对象,对象列表集合和字典)

  • 支持自定义的转换函数

  • 支持结构体struct

  • 支持Realm和Alamofire集成,AlamofireObjectMapper

Realm是iOS开发比较流行的针对移动端设计的数据库,代替sqlite,也有Android版本。

使用例子:

let user = Mapper<User>().map(JSONString)
let JSONString = Mapper().toJSONString(user, prettyPrint: true)

Realm是iOS开发比较流行的针对移动端设计的数据库,代替sqlite,也有Android版本。

图片缓存框架,Android开发经常使用Glide和Fresco,OC开发通常用SDWebImage,Swift开发推荐用HanekeSwift.

开发工具比较

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,Android Studio出现后谷歌推荐用Gradle。Android的构建工具比iOS功能要强大不少。

iOS开发早期用CocoaPods,如今推荐用Carthage,将来Apple官方推出Swift 3.0后会推广官方的Swift Package Manager。

Carthage好处是比较简洁,坏处是有些框架还不支持,特别是国内BAT的一些开源库。

最后介绍下Xcode包管理器Alcatraz,主要提供Xcode插件,模板和色彩模式,相比Android Studio,目前插件还很比较少。


感谢徐川对本文的审校。

相关文章
相关标签/搜索