Swift 在對 Objective-C 改進的 6 個方面

edithfang發表於2014-06-17

在 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同樣支援宣告多個變數來顯示的獲取多返回值:
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的樣子),而不是以後。

英文原文:6 Ways Swift Improves On Objective-C

本文轉載自:OSCHINA


相關閱讀
評論(0)

相關文章