今天分享的主题是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,目前插件还很比较少。

作者:offbye西涛
链接:http://www.jianshu.com/p/7bc8a41c4acb
來源:简书

从Java/Android到Swift iOS开发:语言与框架对比相关推荐

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

    Swift是现在Apple主推的语言,2014年新推出的语言,比 Scala等"新"语言还要年轻10岁.2015年秋已经开源.目前在linux上可用,最近已经支持Android N ...

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

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  3. IOS开发语言Swift入门连载---类型转换

    IOS开发语言Swift入门连载-类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例. 类型转换在 Swift 中使用is 和 as 操作符实现.这两个操作符提供了一种简单达 ...

  4. 一篇文章看懂有关iOS开发语言的一切!

    看什么看!点我呀!全栈程序员,免费入门到精通! 作者丨开发之家 https://www.jianshu.com/p/1fd231cfe54b 前言 iOS开发语言有哪些?OS开发语言主要包括什么?iO ...

  5. ios开发语言本地国际化_开发人员软件本地化最终语言指南

    ios开发语言本地国际化 There are lots of great guides out there for how to prep your product for international ...

  6. iOS 开发之照片框架详解

    一. 概要 在 iOS 设备中,照片和视频是相当重要的一部分.最近刚好在制作一个自定义的 iOS 图片选择器,顺便整理一下 iOS 中对照片框架的使用方法.在 iOS 8 出现之前,开发者只能使用 A ...

  7. 【绝对干货】Swift是花拳绣腿吗?从Swift谈开发语言与程序员的职业发展

    Swift是一种新的编程语言,用于编写 iOS 和 OS X 应用.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 采用安全的编程模式并添加了很多新特性, ...

  8. ios开发语言在c语言的基础上,iOS开发 - C语言基础4(基本语句和运算符) - 猫扑天空...

    iOS开发 - C语言基础4(基本语句和运算符) 基本语句 C语言的基本语句跟Java中的差不多,所以,这里只是简单地提一下 循环语句(do while.while.for) 条件语句(if .if- ...

  9. java和php哪个开发网站好,网站开发,Java和php两种开发语言,应该选哪一种,你知道吗?...

    首先我们得知道Java和php都是一种后端开发语言.而后端开发语言是做什么用的呢? 后端语言主要应用于网站架构建设.业务流程开发及数据库的开发.所以它的强大可想而知了. 但是后端开发语言如果要详细统计 ...

最新文章

  1. 金山词霸2009牛津版
  2. ETSI GS MEC 015,MEP 带宽管理 API
  3. MQTT client id重复导致连接失败
  4. 掌握 Ajax,第 8 部分: 在请求和响应中使用 XML
  5. 在PAT上提交Java代码
  6. C/C++中的常量指针与指针常量
  7. ase支持 urp不_urp管线的自学hlsl之路 第一篇 序言
  8. ubuntu18.04安装pytorch1.6
  9. matlab练习程序(TV模型图像修复)
  10. 基于JAVA+SpringBoot+Mybatis+MYSQL的疫情信息分析管理系统
  11. fiddler无法抓取浏览器的https请求
  12. 完美手柄震动效果-xbox360手柄模拟器下载
  13. HP惠普笔记本Microsoft ACPI-Compliant System未知设备的解决办法
  14. 计算机视觉、机器学习、深度学习相关开源代码集合归纳总结(二)(收藏用)
  15. 如何用电脑破解WiFi
  16. linux常用面试题
  17. JDK1.8 升级这么久!Stream 流的规约操作有哪些?
  18. 树莓派 交叉编译工具链的安装
  19. 用脚本组装xgen 后期文件,缓存正确,毛发飞的可能分析
  20. 【最新】香港出入境政策+自动签注+口岸通关时间【更新2023.2.7】

热门文章

  1. php工程师的段子,江湖上一些关于程序员的段子
  2. 安装python2后中无scripts文件,无pip
  3. java获取微信accessToken
  4. 新的开始——1月英语
  5. 海康接口开发之访客登记(一) 获取人员信息
  6. Carsim基本使用方式
  7. 【计算机网络学习3】数据链路层
  8. boostrap老黄历代码的实现
  9. 上海应用技术学院c语言实验报告5,上海应用技术学院课程设计报告
  10. Transaction synchronization is not active问题