咱們學習的新事物時,一般並非從0開始,而是從已知開始,將新事物與已知的進行比較分析,從而快速全面地瞭解新事物。
而我熟悉Java,因此在學習Swift時,就會將Swift與Java進行比較,思考。(文中的示例代碼均來自The Swift Programming Language:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html?spm=5176.blog7567.yqblogcon1.6.ac0bvH#//apple_ref/doc/uid/TP40014097-CH3-ID0)html
從Java到Swift仍是比較簡單的,相比Object-C,Swift和Java的語法更加接近,和最近的Kotlin就更像了。Swift同時支持面向對象編程和函數式編程。Swift比Java功能更增強大,用法更加友好。網上有一份Java和Swift的粗略對比:java
1.Swift沒有main函數,這個有點像腳本語言。Swift程序的默認入口是main.swift文件,在iOS應用中,則一般標記了@UIApplicationMain的AppDelegate.swift文件。能夠類比到Android中,在AndroidManifest.xml中定義的Application。
2.Swift不須要定義行結束符,這個是像腳本語言同樣。
3.Swift使用var定義變量,通常無需指定具體的數據類型,編譯器會自行判斷。遇到編譯器沒法判斷的狀況,須要本身顯式指定。ios
5.array跟Java中的array是同樣的概念。dictionary就是Java中的map。dictionary的取值的方式是dictionary[key],接口就像array同樣,簡潔方便。
6.nil在swift中就相似Java中的null。nil是沒有初始化成功,是沒有值。
7.optional value是指該value的值能夠是nil,Swift默認一個var是不能賦值nil,除非它聲明瞭optional。optional不能直接輸出,而必須unwrap,形如optionalValue!。有點相似於Java中打包好的null判斷。也能夠用!代替?聲明一個無需unwrap的var。git
1.Swift的switch 語法和Java及C++很像,可是它沒有break,他命中一個case後會自動退出switch。對於幾個不一樣case一樣處理的狀況,能夠case後面連續幾個condition,用逗號隔開。github
2.Swift的switch支持運算,運算的話,就是說不只僅是equal,而是支持知足特定要求。編程
3.while循環和Java或者C++中基本一致,不過while後面直接寫condition,不須要用括號。
4.for循環和Java也基本同樣,不過也是不須要括號。for循環中,..<的用法比較方便。同時還支持_通配符,有點相似與Java中for
each循環。swift
1.函數的定義和Java很不同。Swift函數的定義形如 func functionName(argName: Type) -> Return Type:後端
2.Swift函數能夠返回多個返回值,這個功能真是太猛了。閉包
3.Swift函數能夠接收不定參數,跟Java基本相似的用法。
app
4.函數能夠嵌套,這個是Java或者C++都沒有的,挺好用。例如常常有一段邏輯,用一個函數實現太長,在Java或者C++中,一般是會把它拆分紅幾個函數,保持每一個函數短小,功能單一。可是這樣拆分的函數並不能很好的代表他們是一個功能的,不夠「內聚」。用這種Swift函數嵌套的方式就能較好實現。
5.Swift支持函數類型,根據輸入參數和返回值肯定一個函數類型。函數類型可讓函數像,普通數據類型同樣使用。例如函數的參數能夠另一個函數,注意,不是另一個函數的返回值,而是另一個函數,只要類型符合便可。這個至關因而函數級別的多態,真的有點猛。
6.Swift支持閉包,我以爲能夠理解成「匿名函數」,只須要描述輸入輸出,用in分開輸入輸出描述,已經函數體,無需定義函數名。
1.類的構造函數,直接叫init()。類函數調用跟Java,C++基本同樣。self至關於Java中的this。
2.在Swift中class的成員訪問權限控制級別有public, internal, private對應Java中的public, protected, private。
3.deinit是析構函數。Java中也有finalize()函數。不過Java的finalize()函數並不確保必定被調用,因此並不推薦override該函數。
4.類的繼承跟C++有點像,使用:。
5.他的setter和getter函數跟Java不太同樣,是隱式調用的。我以爲Swift的設計思想是,用戶只需關心輸入和輸出,其餘的不用關心。例如此處只需關心須要set或者get。具體的set和get函數則是封裝的,無需使用者去關心。又譬如上面提到的method的type,只要定義了輸入和輸出,就定義了一類method,那就能夠對這種type有多種具體實現。
6.Swift的枚舉和Java相似,本質是一個類,裏面能夠包含函數。
7.Swift的struct和class寫法基本同樣,區別在於struct傳遞的是內容的copy,而class傳遞的是引用。這個厲害啊。
8.枚舉還支持associated value,這個是Java沒有的。
9.protocol相似於Java中的interface。
10.extension比較強大,甚至變態,能夠動態往某個類中增添函數以及成員變量,動態讓某個類實現某個protocol,而無需修改該類源代碼。Java新增成員變量,新增函數,實現某個interface,Java都只能經過繼承實現。而這個直接實現,且對一切該類的對象生效,包括extend以前已經建立的對象。
11.Swift泛型和Java相似的,Swift的泛型支持where語句,能夠在對類型控制以外,做更加精細的控制。
Swift和Java相似,也無需本身管理內存,Swift是由ARC(Automatic Reference Counting)機制來回收內存的,Java是有垃圾回收機制來保證內存被及時回收。可是二者的回收機制有所區別。個人理解是Swift的ARC機制着眼於無效的對象,就是那些沒有被任何人引用到的對象。所以,若是兩個對象循環引用,就會沒法被回收,引發泄露。此時就須要Weak Reference或者Unowned Reference來打破這個環。
而Java的垃圾回收機制,從反面思考,着眼於哪些是有效的對象,即有被GC Root引用到的對象是有效的,其餘的都是無效的。所以哪怕有對象相互引用,只要沒有被GC Root引用到,都會被垃圾回收器回收掉。從這此處來看,Java的策略更優。也由此能夠看到換個角度看問題是多麼重要。
The Swift Programming Language (Swift 2.1)
what is the entry point of swift code execution? http://stackoverflow.com/questions/24105690/what-is-the-entry-point-of-swift-code-execution
Swift程序入口深度分析 http://00red.com/blog/2014/11/20/swift-main-study/
Swift 函數式編程實踐 http://codebuild.me/2015/09/15/swift-functional-programming-intro/
Java vs Swift http://slidenerd.com/2014/11/15/swift-vs-java/
SwiftGuide https://github.com/ipader/SwiftGuide
Learn the Essentials of Swift https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson1.html
What is an 「unwrapped value」 in Swift? http://stackoverflow.com/questions/24034483/what-is-an-unwrapped-value-in-swift
關於阿里百川
阿里百川(baichuan.taobao.com)是阿里巴巴集團「雲」+「端」的核心戰略是阿里巴巴集團無線開放平臺,基於世界級的後端服務和成熟的商業組件,經過「技術、商業及大數據」的開放,爲移動創業者提供可快速搭建App、商業化APP並提高用戶體驗的解決方案;同時提供多元化的創業服務-物理空間、孵化運營、創業投資等,爲移動創業者提供全面保障。
點擊【 閱讀原文】查看更多精彩!