乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      從Android到Swift iOS開發(fā):語言與框架對比

       quasiceo 2016-07-14

      從Android到Swift iOS開發(fā):語言與框架對比

      作者 張西濤 發(fā)布于 2016年5月23日 | 首屆應(yīng)用性能管理大會 APMCon,聚焦國內(nèi)外性能優(yōu)化先進(jìn)技術(shù)。 1 討論

      本文為『移動前線』群在4月28日的分享總結(jié)整理而成,轉(zhuǎn)載請注明來自『移動開發(fā)前線』公眾號。

      嘉賓介紹

      張西濤,架構(gòu)師,全棧工程師。9年IT行業(yè)工作經(jīng)驗,熟悉Java、Android、JavaScript、Python、Swift等技術(shù),2014年開始關(guān)注Swift iOS開發(fā),最近在專注研究Swift。目前擔(dān)任千米網(wǎng)(專業(yè)電商SaaS平臺)移動端架構(gòu)師。技術(shù)博客是http://。

      我從2009年開始做Android開發(fā),開始接觸Swift是在2014年底,當(dāng)時組里曾經(jīng)做過一個Demo App,感覺技術(shù)還不夠成熟沒有正式發(fā)布。2016年初我們正式使用swift開發(fā)上線了銷售助手App產(chǎn)品,積累了比較豐富的swift項目實戰(zhàn)經(jīng)驗,開源框架都是用的swift版本,大量使用了面向協(xié)議和函數(shù)式編程。iOS App開發(fā)人員基本都是以前安卓版本的開發(fā)人員,同時維護(hù)安卓和iOS 2個版本,效率很高。 今天分享的主題是Java/Android開發(fā)人員如何快速上手Swift iOS開發(fā)。主要內(nèi)容如下:

      1. Why From Java/Android to Swift

      2. Swift語言為什么值得學(xué)習(xí)?

      3. Java vs Swift語法比較

      4. Android和iOS UI開發(fā)比較

      5. Android vs Swift iOS框架比較

      6. 開發(fā)工具比較

      Why From Java/Android to Swift

      成本和效率方面,由于目前同業(yè)務(wù)的Android和iOS App產(chǎn)品功能一致,由一個團(tuán)隊開發(fā)可以降低業(yè)務(wù)同步和溝通成本,避免安卓和iOS兩個團(tuán)隊帶來的產(chǎn)品功能差異和溝通成本。

      Swift語法更接近Java,相對Objective C上手容易,我2012年曾經(jīng)帶過iOS項目,學(xué)過oc,因為無法忍受oc奇怪的語法最后放棄了,但這次學(xué)習(xí)swift iOS過程還是挺順暢的,學(xué)習(xí)的主要門檻反而是Xcode IB的使用。

      Why not React Native?

      React Native我們也要項目在用。但RN思想和語法的學(xué)習(xí)曲線有些陡,很多有Web開發(fā)經(jīng)驗的人都不一定喜歡。另外很多安卓開發(fā)者并沒有學(xué)習(xí)過js,學(xué)習(xí)React Native成本會比較高。學(xué)習(xí)React Native最終還是要對原生開發(fā)有一定的了解。最后,在一些功能復(fù)雜的App,React Native用戶體驗比不上原生 。

      Why not HTML5 Hybrid App?

      用戶體驗不夠好,對于不熟悉Web開發(fā)的工程師學(xué)習(xí)成本比較高。

      以前我們用ionic做過混合App,在iOS上效果可以,但安卓低端機(jī)上比較卡,影響體驗。

      我們現(xiàn)在也有App是React Native做的,大概是去年11月上線的,用戶體驗還不錯,但開發(fā)人員基本上是以前的前端開發(fā)。

      Swift語言為什么值得學(xué)習(xí)?

      Swift是現(xiàn)在Apple主推的語言,2014年新推出的語言,比Scala等“新”語言還要年輕10歲。2015年秋已經(jīng)開源。目前在linux上可用,最近已經(jīng)支持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支持多范式編程:面向協(xié)議,面向?qū)ο蠛秃瘮?shù)式編程。最后,我們還可以通過Swift學(xué)習(xí)函數(shù)式編程思想,這塊Java8才支持。

      Java vs. Swift語法比較

      基礎(chǔ)語法

      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中try catch和do while和java差異很大。

      函數(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ù)可以帶默認(rèn)值,和Python類似,Java函數(shù)不可以帶有默認(rèn)值。

      常用的函數(shù)式編程方法map,reduce, flatMap,filter,sort,相對于理解抽象的函數(shù)式編程概念,我覺得開始時先用好這些函數(shù)更重要。

      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相當(dāng)于Java中的this,傳入生命周期不一致的閉包時需要聲明為weak。

      Enum枚舉

      Android開發(fā)谷歌官方不建議使用Enum,影響性能。

      Swift的Enum和Java類似,本質(zhì)是一個類,里面可以包含函數(shù)。

      Swift Enum語法更簡單。

      Swift Enum支持?jǐn)U展extension。

      Interface vs. Protocol

      Extension擴(kuò)展就是向一個已有的類、結(jié)構(gòu)體或枚舉類型添加新功能(functionality)。這包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類型的能力(即逆向建模)。擴(kuò)展和 Objective-C 中的分類(categories)類似。

      Swift 中的擴(kuò)展可以:

      • 添加計算型屬性和計算靜態(tài)屬性

      • 定義實例方法和類型方法

      • 提供新的構(gòu)造器

      • 定義下標(biāo)

      • 定義和使用新的嵌套類型

      • 使一個已有類型符合某個接口

      Swift 中的擴(kuò)展很強(qiáng)大,struct class enum都可以,也可以擴(kuò)展系統(tǒng)的類。需要注意的是擴(kuò)展方法的作用域問題,這里不展開討論。

      MultiThread多線程

      iOS的多線程相對Java來說比較簡單,GCD一天時間基本就能夠弄明白。Java的Concurrency包就比較復(fù)雜了。

      Android,iOS UI開發(fā)比較

      iOS開發(fā)蘋果官方建議使用Storyboard開發(fā)UI,好處是比較直觀,通過看界面可以更好的理解和維護(hù)App?,F(xiàn)在Xcode7版本對AutoLayout和SizeClasses的支持越來越好,多分辨率適配變得簡單,建議大家放棄使用frame代碼寫界面的傳統(tǒng)做法。

      當(dāng)然,Storyboard也有下面的弊端:

      界面主要依靠IB生成,Xib代碼難以維護(hù),Xcode打開Storyboard或Xib就會對文件產(chǎn)生修改,即使我們沒有做實際的修改,git也會顯示文件修改了。

      多人協(xié)助,同時修改導(dǎo)致沖突,合并困難。

      Storyboard中包含頁面多了后會占用了太多內(nèi)存,導(dǎo)致Xcode卡頓和崩潰。

      錯誤定位困難,錯誤提示不清晰,新手難以定位錯誤。例如不小心刪掉了IBOutlet會很難定位。

      Storyboard UI 開發(fā)實踐

      按照業(yè)務(wù)模塊分成多個Storyboard,每人負(fù)責(zé)的模塊避免交叉。

      每個storyboard不要超過10個頁面,可以通過Refactor  Storyboard功能重新劃分。

      用Container在一個storyboard復(fù)用UI模塊,用xib在多個storyboard復(fù)用UI模塊。

      復(fù)雜的輸入表單,建議用SwiftyForm框架寫代碼。

      使用Size Classes做多分辨率適配比較輕松。

      Android vs Swift iOS框架比較

      Swift框架現(xiàn)在已經(jīng)很多了,Swift也可以使用OC開源框架,但不推薦使用。我們主要對比介紹項目常用的網(wǎng)絡(luò)請求框架,JSON解析和圖片緩存框架。

      在Android開發(fā)現(xiàn)在一般使用OKHTTP,Retrofit和Volley等網(wǎng)絡(luò)框架進(jìn)行開發(fā),iOS開發(fā)oc時代使用AFNetworking庫開發(fā),swift開發(fā)推薦使用Alamofire和Moya庫。

      Moya 對Alamofire網(wǎng)絡(luò)請求庫進(jìn)行了封裝,開發(fā)不需要寫網(wǎng)絡(luò)模型,管理等。使代碼更加簡潔。Moya可以代替自己編寫的網(wǎng)絡(luò)抽象層APIManager。Moya提供了一些很好的特性:

      • 編譯期檢查API接口調(diào)用的正確性

      • 通過enum枚舉類型清晰的定義不同API的接口

      • 把接口測試stub作為一等公民,讓單元測試變得很簡單。

      • 支持ReactiveX擴(kuò)展,方便和RxSwift集成。

      • Moya比Android Retrofit 多了模擬數(shù)據(jù)調(diào)試的功能。

      目前App基本都是使用JSON作為報文協(xié)議,Android開發(fā)我們一般使用Gson進(jìn)行解析,在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

      Realm是iOS開發(fā)比較流行的針對移動端設(shè)計的數(shù)據(jù)庫,代替sqlite,也有Android版本。

      使用例子:

      let user = Mapper<User>().map(JSONString)
      let JSONString = Mapper().toJSONString(user, prettyPrint: true)

      Realm是iOS開發(fā)比較流行的針對移動端設(shè)計的數(shù)據(jù)庫,代替sqlite,也有Android版本。

      圖片緩存框架,Android開發(fā)常用Glide和Fresco,OC開發(fā)一般用SDWebImage,Swift開發(fā)推薦用HanekeSwift.

      開發(fā)工具比較

      Android目前主流的開發(fā)工具是Android Studio,2014年以前是Eclipse ADT。
      iOS開發(fā)一直使用Xcode。對于Java/Android開發(fā)人員來說,Xcode上手較難,特別是Interface Builder,Xib和視圖代碼直接通過連線來生成事件方法,比較挑戰(zhàn)開發(fā)習(xí)慣,并且出現(xiàn)問題定位困難。而Android開發(fā)者習(xí)慣手寫xml界面代碼。

      與Android Studio相比,Xcode速度快,但不夠穩(wěn)定,一天崩潰幾次很正常。
      模擬器方面,Android的Emulator是虛擬機(jī),啟動和安裝速度比較慢,iOS是Simulator,速度快,但有些功能不能模擬。都推薦使用真機(jī)進(jìn)行開發(fā)。

      包管理器&構(gòu)建工具對比

      Android開發(fā)早期用Ant做一些任務(wù)處理,后面有些團(tuán)隊借鑒Java EE項目的做法用Maven,Android Studio出現(xiàn)后谷歌推薦用Gradle。Android的構(gòu)建工具比iOS功能要強(qiáng)大很多。

      iOS開發(fā)早期用CocoaPods,現(xiàn)在推薦用Carthage,未來Apple官方推出Swift 3.0后會推廣官方的Swift Package Manager。

      Carthage好處是比較簡潔,壞處是有些框架還不支持,特別是國內(nèi)BAT的一些開源庫。

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


      感謝徐川對本文的審校。

      給InfoQ中文站投稿或者參與內(nèi)容翻譯工作,請郵件至editors@cn.。也歡迎大家通過新浪微博(@InfoQ,@丁曉昀),微信(微信號:InfoQChina)關(guān)注我們。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多