設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 1016|回復: 0
打印 上一主題 下一主題

Android與Swift iOS開發:語言與框架對比

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2017-4-30 11:03:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
Android與Swift iOS開發:語言與框架對比
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差異很大。

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開發推薦使用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都可以,也可以擴展系統的類。需要注意的是擴展方法的作用域問題,這裡不展開討論。

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



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-5-15 23:10 , Processed in 0.239988 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表