Swift 在對 Objective-C 改進的 6 個方面
Swift 在對 Objective-C 改進的 6 個方面
在 Atomic Object 的安娜堡辦公室,我們做了一個觀看2014年的WWDC主題演講,毫不夸張地說,當Swift宣布的時候,我們感到十分激動。Swift,蘋果正在推進的一個更現代的編程語言。我很高興能獲得先機并開始用它開發。
在這篇博文中,我將重點介紹Swift的幾個語言特性,這將使開發者的工作更加輕松。
Objective-C語言的問題
當一個開發者申請一個關于Atomic Object的新職位時,我們會給他填寫一個(GTKY) Getting To Know You的表。這個表要求填寫一些常見的問題,包括技術和其他方面,比如你最喜歡的語言是什么,你會做些什么來改進它?很多開發者的回答不能令人滿意,即使開發人員選擇objective-C作為他們最喜愛的語言時,也想不出如何改進它!
這個回答產生了大量的討論,讓我想起一個Objective-C的問題。僅舉幾例:
-
弱類型 - 通常處理id或class,并且需要可怕的C static casts 。
-
欠佳的枚舉語法 - for in已經很好了,但我經常想到一個更好的索引。
-
缺少操作符重載的類,例如NSNumber的。
所以,我很高興蘋果宣布swift并公開了其語言細節。在這里我會談一些對Objective-C語言的批評。我強烈建議開發人員下載Swift的書,看一看在Xcode 6的測試版。
激動人心的Swift特性
1. 類型推斷
對我來說這個很有用。無比煩惱的是你不得不將id類型的實例非安全的轉化為實際類型,這很容易出錯并且向一個實際對象并不相應的id發送信號。總是檢查respondsToSelector太乏味了。Swift給我們提供了一個解決方案---var關鍵字:
1> var anInt = 0 anInt: Int = 0 2> var aDouble = 0.0 aDouble: Double = 0 3> var anotherDouble: Double = 0 anotherDouble: Double = 0 4> var aString = "some string" aString: String = "some string"
注意:就像anotherDouble那種情況,你也可以顯示的設置類型。可以用var同樣的方式使用let來推斷常量的類型。
2. 改進枚舉語法
Objective-C有不錯的集合枚舉語法:
for (SomeType someObject in array) NSLog(@"%@", someObject.whatever);
這是個不錯的語法糖,但是問題是現實編程中,我通常需要一個和集合中元素實例一起的索引變量。.
Swift 給了我們許多有用的集合枚舉器, 但是尤其令人高興的是他們提供了一個全局的enumerate()方法,可以用來返回一個包含了數組中元素和索引的元組。
19> array $R2: String[] = size=4 { [0] = "one" [1] = "two" [2] = "three" [3] = "four" } 20> for (index, value) in enumerate(array) { 21. println("Item \(index): \(value)") 22. } Item 0: one Item 1: two Item 2: three Item 3: four 23>
3. Override關鍵字
當在類中聲明一個實例函數時,如果他們覆蓋了一個基類函數,他們必須標記為override的。如果沒有這么做則會得到一個編譯時錯誤。類似的,如果一個標記為override的函數沒有覆蓋基類的相應函數,同樣得到一個編譯錯誤。這一行為將的類更加的清晰和降低運行時崩潰的可能性。
4. 多返回值
在我加入Atomic之前的那份工作中,我主要開發C++,并且經常發現自己寫一些輸出多值的方法。我總是為決定使用引用,pair還是將返回值包裝為struct或class來作為參數傳遞而掙扎不已。
在Swift中,有內置的機制來用一個由任意數量的帶標記的數據成員的組成的元組作為多返回值。
46> func calculateStatisticsFromArray(data: Double[]) -> (mean: Double, median: Double, mode: Double) { 47. return (62, 44, 12) 48. } 49> var stats = calculateStatisticsFromArray([]) stats: (mean: Double, median: Double, mode: Double) = { mean = 62 median = 44 mode = 12 } 50> stats.mean $R10: Double = 62 51> stats.median $R11: Double = 44 52> stats.mode $R12: Double = 12
Swift同樣支持聲明多個變量來顯示的獲取多返回值:
<51> var(mean, median, mode) = calculateStatisticsFromArray(data)
5. willSet, didSet
在 Swift中, 類具有屬性(類似于Objective-C)。有一個聲明setter和getter的機制,如果屬性的類型是簡單的并且需要計算的,但是你想觀察他們的變化,兩個內置的需要覆蓋的方法-willSet和didSet將會有幫助。
1> class Container { 2. var someValue: Double = 0.0 { 3. willSet { 4. println("willSet! \(newValue)") 5. } 6. didSet { 7. println("didSet! \(someValue)") 8. } 9. } 10. } 11> var c = Container() c: Container = { someValue = 0 } 12> c.someValue = 100.0 willSet! 100.0 didSet! 100.0
6. REPL
REPL表示“read-evaluate-print-loop”,我認為它是通過沙箱測試輸出的代碼.您可以輸入代碼到REPL,如果您在使用一個IDE或者喜愛的文本編輯器,它會被編譯/解釋和實時運行,并馬上能讓你看到輸出結果。這是開發人員努力學習這門新語言時能看到的一個強大功能。我一直在使用它來學習swift。
使用SWIFT REPL:
1.下載Xcode 6 Beta版。
2.在終端中運行以下命令來切換路徑xcrun:
sudo xcode-select -switch /Applications/Xcode6-Beta.app/Contents/Developer.
注意:如果要重置,請在使用終端里鍵入 xcode-select -r
3.xcrun swift
誰將擁有未來?
我堅信,在iOS 8和以后的版本中,Swift將成長成為iOS開發的主流語言。盡管如此,蘋果已經向我們保證,在運行時將保持二者兼容:我們的Objective-C應用程序仍然可以繼續工作。同樣清楚的是Swift的語法和語義將改變后的iOS 8。蘋果告訴我們,他們不能保證源代碼的兼容性,但會提供代碼轉換器。使用代碼轉換器的想法讓我害怕了一下,我認為遷移到Swift的時間會來得早(iOS的8-9的樣子),而不是以后。
本文地址:http://www.oschina.net/translate/swift-improves-objective-c
原文地址:http://spin.atomicobject.com/2014/06/13/swift-improves-objective-c/