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,目前插件還很比較少。


感謝徐川對本文的審校。

相關文章
相關標籤/搜索