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

这是tiobe发布的编程语言排行

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差异很大。

  函数和闭包

wift函数的定义和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,目前插件还很比较少。

Android与Swift iOS开发:语言与框架对比的更多相关文章

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

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

  2. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  3. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

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

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  5. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  6. iOS - Swift iOS 开发体系

    1.iOS 开发技术体系 iOS 开发技术体系图: 层级 主要框架 Cocoa Touch UIKit 等 Media Core Graphics .OpenGl ES.Core Animation ...

  7. iOS开发--SQLite重要框架FMDB的使用

    什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架.主要把C语言操作数据库的代码用OC进行了封装.使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等. ...

  8. ReactiveCocoa - iOS开发的新框架

    本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC ...

  9. RubyMotion之父:Ruby是目前替代Objective-C的最佳iOS开发语言

    发表于2012-08-16 00:52| 21716次阅读| 来源CSDN| 24 条评论| 作者杨鹏飞 RubyMotionRubyObjective-CiOSJava 摘要:曾几何时,PC端有那么 ...

随机推荐

  1. 从KRE到XRE:ASP.NET 5中正在消失的那些K

    前几天写了篇博客ASP.NET 5中的那些K,刚把ASP.NET 5中的那些K搞明白了些,昨天发现微软正在让那些K消失. 首先是在 KRuntime 的git日志中发现的: * Runtime ren ...

  2. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  3. java API:AtomicInteger

    An int value that may be updated atomically. See the java.util.concurrent.atomic package specificati ...

  4. String的length()和Array的length

    String是个final修饰的最终类,不能被继承,String中属性都设置为private,方法为public,并不提供set方法,想要获得字符串的长度必须调用length()方法这个长度是确定的, ...

  5. 缓存篇~第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存

    返回目录 这一讲中主要是说EnterpriseLibrary企业级架构里的caching组件,它主要实现了项目缓存功能,它支持四种持久化方式,内存,文件,数据库和自定义,对于持久化不是今天讨论的重要, ...

  6. [Java类加载器]Java中classLoader浅析.

    本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.l ...

  7. javascript_core_06之正则、Math、Date

    1.RegExp:Regular Expression,创建封装正则表达式: ①正则直接量:var reg=/reg/ig:②var reg=new RegExp(“reg”,“ig”): 2.Reg ...

  8. 11.按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另 一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。

    package java1; public class Che { //属性 public String nub; public int speed; public double weight ; C ...

  9. CCNA网络工程师学习进程(5)路由器和交换机的登录安全配置和vlan划分

        本节详细介绍路由器和交换机的登录安全配置以及VLAN划分的原理.     (1)登录安全配置: 路由器登录有两种验证方式:有本地验证方式和远程验证方式.本地登录验证方式可以配置用户名和密码也可 ...

  10. Java中的数是用补码表示的检验

    一.基本介绍(关于下列五个定义来自http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html#!comments,谢原 ...