從Java/Android到Swift iOS開發:語言與架構對比

來源:互聯網
上載者:User

標籤:

本文是我在『移動前線』群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.4Enum枚舉

Android開發Google官方不建議使用Enum,影響效能。

Swift的Enum和Java類似,本質是一個類,裡面可以包含函數。

SwiftEnum文法更簡單。

SwiftEnum支援擴充extension。

 

3.5Interface 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

?       Java 5 Concurrency包

?       Android多線程擴充

?       AsyncTask,Looper…

 

?       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出現後Google推薦用Gradle。Android的構建工具比iOS功能要強大很多。

iOS開發早期用CocoaPods,現在推薦用Carthage,未來Apple官方推出Swift3.0後會推廣官方的Swift Package Manager。

最後介紹下Xcode包管理器Alcatraz,主要提供Xcode外掛程式,模板和色彩模式,相比Android Studio,目前外掛程式還很比較少。


從Java/Android到Swift iOS開發:語言與架構對比

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.