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

来源:http://www.cnblogs.com/salam/archive/2016/05/25/5525664.html
-Advertisement-
Play Games

Swift是現在Apple主推的語言,2014年新推出的語言,比Scala等“新”語言還要年輕10歲。2015年秋已經開源。目前在linux上可用,最近已經支持Android NDK;在樹莓派上有SwiftyGPIO庫,可以通過GPIO控制一些硬體。 Object C is old and ugly ...


  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差異很大。

 

  函數和閉包

wift函數的定義和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,目前插件還很比較少。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 終於完成了手頭的項目,失蹤人口又回歸啦!在做項目的過程中,遇到很多值得思考的點,速速道來。 第一個遇到的就是網頁大小自適應的問題。 目前比較常用的方法有: 首先要讓頁面大小鋪滿屏幕又不能溢出。只需要在html``標簽內加入viewport(如下),參數分別表示:頁面寬度= 屏幕寬度,最大和最小伸縮比 ...
  • 最近在模仿各大網站寫頁面樣式和交互,發現好多都有回到頂部的需要,所以寫了一下js,記錄下來。 發現還可以添加從快到慢的動畫效果和隨時下拉滾動條停止滾動的功能, 參考了imooc上相關課程,最終實現JS代碼如下: ...
  • 這款app是我花一周左右時間做出來的,一款閱讀笑話,段子,糗事,腦筋急轉彎,神回覆,語錄,謎語等的休閑娛樂app,用戶除了可以瀏覽他人發佈的內容外,自己也可以發佈相關內容,和其他人一同分享有趣的內容,整個app集成了用戶註冊登錄,修改昵稱用戶名及個性簽名併在前端調用顯示,用戶自主發佈帖子,他人點贊, ...
  • 比如我們想在xib 中設置按鈕的圓角,這樣的話我們就可以在xib文件中進行修改,具體操作如下 實現效果,如下 ...
  • 代碼: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //使圖片兩邊不拉伸,中間拉伸 UIImage *image = [UIImage imageNamed ...
  • 轉自:http://blog.csdn.net/totogo2010/article/details/9100767 準備2個文件: 文件一,ThisService.app 文件二,Doxygen.rb 下載上述2個文件:ThisService&Doxygen_rb 準備好之後,兩步配置,一步操作: ...
  • CocoaPods是什麼 當我們開發iOS項目時候,會經常使用到第三方類庫,並且會使用很多。大家的做法基本上都是到GitHub上下載一個一個的類庫,然後導入到工程中,並且引入各種的類庫,做各種的配置。有時候還要處理ARC與MRC的問題,很麻煩。還有一種情況,就是當第三方類庫出現升級的情況時候,我們還 ...
  • 大家都知道在Android中通過AIDL可以跨進程調用Service中的數據,網上也有很多實例,但是大部分實例都是關於基本數據類型的遠程調用,很少講到複雜數據的調用,今天我用一個例子來演示一下怎樣用AIDL Service 傳遞複雜數據。 我們分2步開始: 第一步:部署我們的服務端,也就是Servi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...