今天分享的主題是Java/Android開發(fā)人員如何快速上手Swift iOS開發(fā)。主要內(nèi)容如下:
-
WhyFrom Java/Android to Swift
Swift語言為什么值得學習?
Javavs Swift語法比較
Android和iOS UI開發(fā)比較
Androidvs Swift iOS框架比較
開發(fā)工具比較
1、Why FromJava/Android to Swift
成本和效率
由于目前同業(yè)務的Android和iOS App產(chǎn)品功能一致,由一個團隊開發(fā)可以降低業(yè)務同步和溝通成本,避免安卓和iOS兩個團隊帶來的產(chǎn)品功能差異和溝通成本。
Swift語法更接近Java,相對Objective C上手容易,我2012年曾經(jīng)帶過iOS項目,學過oc,因為無法忍受oc奇怪的語法最后放棄了,但這次學習swift iOS過程還是挺順暢的,學習的主要門檻反而是Xcode IB的使用。
Why not React Native?
ReactNative我們也要項目在用。但RN思想和語法的學習曲線有些陡,很多有Web開發(fā)經(jīng)驗的人都不一定喜歡。另外很多安卓開發(fā)者并沒有學習過js,學習React Native成本會比較高。學習React Native最終還是要對原生開發(fā)有一定的了解。最后,在一些功能復雜的App,React Native用戶體驗比不上原生 。
Why not HTML5 Hybrid App?
用戶體驗不夠好,對于不熟悉Web開發(fā)的工程師學習成本比較高。
2014年我們用ionic框架做過混合App,在iOS上效果可以,但在安卓低端機上比較卡,影響用戶體驗。
2、Swift語言為什么值得學習?
Swift是現(xiàn)在Apple主推的語言,2014年新推出的語言,比Scala等“新”語言還要年輕10歲。2015年秋已經(jīng)開源。目前在linux上可用,最近已經(jīng)支持Android NDK;在樹莓派上有SwiftyGPIO庫,可以通過GPIO控制一些硬件。
ObjectC is old and ugly,oc是1983年蘋果推出的,過于陳舊和臃腫。
Swift語法類似Scala,Javascript ES6, Java,OC, C , Python,這個我是按照語法相似度排序的。
Swift支持多范式編程:面向協(xié)議,面向?qū)ο蠛?span id="a0aaaaa" class="candidate-entity-word" data-gid="5316415">函數(shù)式編程 。
最后,我們還可以通過Swift學習函數(shù)式編程思想,這塊Java8才支持。
3、Java vs. Swift語法比較
-
基礎(chǔ)語法
函數(shù)
struct和class
Enum
Interface vsProtocol
MultiThread
3.1基礎(chǔ)語法
Java | Swift |
---|---|
static final 常量 | var 變量,let常量 |
Java語言沒有,Guava庫提供 | 可選型Optional,通過if let解包 |
Java支持自增 ,自減— | Swift不建議使用,3.0版本將不支持自增 |
邏輯控制和C基本一致 | 邏輯控制語句更現(xiàn)代 |
Java有main方法 | Swift沒有main方法 |
Java需要;做行結(jié)束符 | Swift不需要行結(jié)束符 |
Swift的switch 語法和Java及C 很像,但是它沒有break,他命中一個case后會自動退出switch。對于幾個不同case同樣處理的情況,可以case后面連續(xù)幾個condition,用逗號隔開。
for循環(huán)和Java也基本一樣,不過也是不需要括號。for循環(huán)中,..<的用法比較方便。下劃線符號_(替代循環(huán)中的變量)能夠忽略具體的值,并且不提供循環(huán)遍歷時對值的訪問。for-in則有點類似與Java中for each循環(huán)。
Swift 2.2中trycatch和do while和java差異很大
3.2 函數(shù)和閉包
Swift函數(shù)的定義和Java很不一樣,Swift函數(shù)的定義形如 func foo(arg: Type) ->Return Type:
Swift中函數(shù)是一等公民,可以作為返回值和參數(shù);Swift支持閉包,Java8才支持lambda閉包。
Swift支持元組,Swift函數(shù)可以通過返回元組支持多個返回值。
Swift函數(shù)可以嵌套,即一個函數(shù)內(nèi)部還可以定義函數(shù),Java不支持。
Swift函數(shù)可以接收不定參數(shù),跟Java基本類似
Swift函數(shù)參數(shù)可以帶默認值,和Python類似,Java函數(shù)不可以帶有默認值。
常用的函數(shù)式編程方法map,reduce, flatMap,filter,sort,相對于理解抽象的函數(shù)式編程概念,我覺得開始時先用好這些函數(shù)更重要。
3.3 struct vs. class
struct是值類,class是引用類型,Java語言沒有struct,但c/c /c#語言都有。
Swift開發(fā)推薦使用struct,而不是class。Swift語言實現(xiàn)包括幾百個struct,只有幾個class。
Swift類構(gòu)造方法是init(),析構(gòu)方法是deinit(),類方法調(diào)用跟Java基本一樣。
self相當于Java中的this,傳入生命周期不一致的閉包時需要聲明為weak。
3.4 Enum枚舉
Android開發(fā)谷歌官方不建議使用Enum,影響性能。
Swift的Enum和Java類似,本質(zhì)是一個類,里面可以包含函數(shù)。
SwiftEnum語法更簡單。
SwiftEnum支持擴展extension。
3.5 Interface vs. Protocol
Java Interface | Swift Protocol |
---|---|
可以繼承 | 可以繼承 |
Interface不能帶有具體實現(xiàn)的方法,Java8以后才可以 | protocol可以帶有具體實現(xiàn)的方法 |
implements | extension更強大 |
Extension擴展就是向一個已有的類、結(jié)構(gòu)體或枚舉類型添加新功能(functionality)。這包括在沒有權(quán)限獲取原始源代碼的情況下擴展類型的能力(即逆向建模)。擴展和 Objective-C 中的分類(categories)類似。
Swift 中的擴展可以:
-
添加計算型屬性和計算靜態(tài)屬性
定義實例方法和類型方法
提供新的構(gòu)造器
定義下標
定義和使用新的嵌套類型
使一個已有類型符合某個接口
需要注意的是擴展方法的作用域問題,這里不展開討論。
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開發(fā)比較
Java Android | Swift iOS |
---|---|
Xml layout布局 | Xib & StoryBoard |
直接寫xml代碼,可視化輔助開發(fā) | AutoLayout和SizeClass,IB自動生成,代碼合并困難; |
Android可以用Java添加和實現(xiàn)view | 很多團隊只好用代碼實現(xiàn)UI界面 |
Intent頁面跳轉(zhuǎn) | Segue連線跳轉(zhuǎn) |
Java自定義view,可以在Activity和layout中使用,可視化支持不夠好 | 自定義View可以使用IBDesignable & runtime attributes |
iOS開發(fā)蘋果官方建議使用Storyboard開發(fā)UI,好處是比較直觀,通過看界面可以更好的理解和維護App?,F(xiàn)在Xcode7版本對AutoLayout和SizeClasses的支持越來越好,多分辨率適配變得簡單,建議大家放棄使用frame代碼寫界面的傳統(tǒng)做法。
當然,Storyboard也有下面的弊端:
界面主要依靠IB生成,Xib代碼難以維護,Xcode打開Storyboard或Xib就會對文件產(chǎn)生修改,即使我們沒有做實際的修改,git也會顯示文件修改了。
多人協(xié)助,同時修改導致沖突,合并困難。
Storyboard中包含頁面多了后會占用了太多內(nèi)存,導致Xcode卡頓和崩潰。
錯誤定位困難,錯誤提示不清晰,新手難以定位錯誤。例如不小心刪掉了IBOutlet會很難定位。
Storyboard UI 開發(fā)實踐
按照業(yè)務模塊分成多個Storyboard,每人負責的模塊避免交叉。
每個storyboard不要超過10個頁面,可以通過Refactor Storyboard功能重新劃分。
用Container在一個storyboard復用UI模塊,用xib在多個storyboard復用UI模塊。
復雜的輸入表單,建議用SwiftyForm框架寫代碼。
5、Android vs Swift iOS框架比較
Swift框架現(xiàn)在已經(jīng)很多了,Swift也可以使用OC開源框架,但不推薦使用。我們主要對比介紹項目常用的網(wǎng)絡請求框架,JSON解析和圖片緩存框架
網(wǎng)絡請求框架
Java Android | Swift iOS |
---|---|
Retrofit | Moya |
OKHTTP | Alamofire |
Volley | AFNetworking |
Retrofit RxAndroid | Moya RxSwift |
在Android開發(fā)現(xiàn)在一般使用OKHTTP,Retrofit和Volley等網(wǎng)絡框架進行開發(fā),iOS開發(fā)oc時代使用AFNetworking庫開發(fā),swift開發(fā)推薦使用Alamofire和Moya庫。
Moya 對Alamofire網(wǎng)絡請求庫進行了封裝,開發(fā)不需要寫網(wǎng)絡模型,管理等。使代碼更加簡潔。Moya可以代替自己編寫的網(wǎng)絡抽象層APIManager。Moya提供了一些很好的特性:
編譯期檢查API接口調(diào)用的正確性
通過enum枚舉類型清晰的定義不同API的接口
把接口測試stub作為一等公民,讓單元測試變得很簡單。
支持ReactiveX擴展,方便和RxSwift集成。
目前App基本都是使用JSON作為報文協(xié)議,Android開發(fā)我們一般使用Gson進行解析,在Swift開發(fā)中,對比了ObjectMapper,Argo Curry,SwiftyJson后,我們* 決定使用ObjectMapper作為JSON解析框架。ObjectMapper支持的特性如下:
-
支持把對象轉(zhuǎn)換成JSON,把JSON轉(zhuǎn)換成類對象
支持嵌套的對象(單一對象,對象列表集合和字典)
支持自定義的轉(zhuǎn)換函數(shù)
支持結(jié)構(gòu)體struct
支持Realm和Alamofire集成,AlamofireObjectMapper
使用例子:
let user = Mapper<User>().map(JSONString)let JSONString = Mapper().toJSONString(user, prettyPrint: true)
Realm是iOS開發(fā)比較流行的針對移動端設計的數(shù)據(jù)庫,代替sqlite,也有Android版本
圖片緩存框架,Android開發(fā)常用Glide和Fresco,OC開發(fā)一般用SDWebImage,Swift開發(fā)推薦用HanekeSwift。
6、開發(fā)工具比較
Android目前主流的開發(fā)工具是Android Studio,2014年以前是Eclipse ADT。
iOS開發(fā)一直使用Xcode。對于Java/Android開發(fā)人員來說,Xcode上手較難,特別是Interface Builder,Xib和視圖代碼直接通過連線來生成事件方法,比較挑戰(zhàn)開發(fā)習慣,并且出現(xiàn)問題定位困難。而Android開發(fā)者習慣手寫xml界面代碼。
與Android Studio相比,Xcode速度快,但不夠穩(wěn)定,一天崩潰幾次很正常。
模擬器方面,Android的Emulator是虛擬機,啟動和安裝速度比較慢,iOS是Simulator,速度快,但有些功能不能模擬。都推薦使用真機進行開發(fā)。
包管理器&構(gòu)建工具對比
Android開發(fā)早期用Ant做一些任務處理,后面有些團隊借鑒Java EE項目的做法用Maven,AndroidStudio出現(xiàn)后谷歌推薦用Gradle。Android的構(gòu)建工具比iOS功能要強大很多。
iOS開發(fā)早期用CocoaPods,現(xiàn)在推薦用Carthage,未來Apple官方推出Swift3.0后會推廣官方的Swift Package Manager。
最后介紹下Xcode包管理器Alcatraz,主要提供Xcode插件,模板和色彩模式,相比Android Studio,目前插件還很比較少。
作者:offbye西濤
鏈接:http://www.jianshu.com/p/7bc8a41c4acb
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。