位置:首頁 > 高級語言 > Swift教學 > Swift快速入門

Swift快速入門

Swift是蘋果的品牌新的編程語言,在2014年WWDC(蘋果開發者大會)上發布的編程語言。

隨著Swift語言的發布,蘋果也發布了一個出色的SWIFT的參考指南,這裡強烈推薦。

但是這個學習指南又長又瘦!所以,如果冇有很多的時間,隻是想快速學習Swift,那麼本教學就是為你準備的。

本 Swift 教學將需要大約25分鐘學習,給出 Swift 語言一個快速瀏覽,包括變量,控製流,類等以及更多的最佳實踐。

對於本Swift教學,需要Xcode最新版本(在寫這篇Swift教學的時候使用的是Xcode 6.1.1)。學習本教學之前不需要任何Swift和Objective-C的經驗,但如果有一些編程經驗,但這會對理解和學習有幫助。

注意: 請確保有最新的Xcode(在Mac App Store檢查以確保)。Swift正在發生迅速的變化,我們正在竭儘所能為每一個測試版更新本教學; 代碼可能無法正常工作在舊版本的Xcode中的或預發行版本中。

Playgrounds簡介

啟動 Xcode 6, 並轉到 File\New\File. 選擇 iOS\Source\Playground, 並點擊 Next.

955315.png

命名文件為 SwiftTutorial.playground, 並點擊 Create, 並保存在一個方便的地方. 刪除其它不用的文件,以保持一個乾淨的文件目錄.

playground 是一種文件類型,並且允許測試 Swift 代碼, 可以側邊欄查看每一行的結果. 例如:添加以下行到 playground 中:

let tutorialTeam = 60
let editorialTeam = 17
let totalTeam = tutorialTeam + editorialTeam

當編寫輸入這些行,會看到側邊欄上的每一行的結果。是不是很方便?

Playgrounds是學習Swift一個很好的方式(比如這個Swift教學)來試驗新的API,原型代碼或算法,或可視化繪製代碼。 在本Swift教學的其餘部分,將使用 playground。

注意: 在這一點上,建議拖動playground文件(SwiftTutorial.playground)到OS X Dock中。

通過這種方式,可以測試一些代碼,Swift使用此文件作為一個快速的暫存器。 當然,對於這個工作,必須有playground在一個地方,不能隨便移動它。

Swift變量VS常量

嘗試添加下麵一行到 playground 的底部:

totalTeam += 1

當加入這一行,會發現有一個錯誤。 這是因為 totalTeam 是一個常數,這意味著它的值永遠不會改變。Swift中使用關鍵字 let 聲明常數。

如果想要 totalTeam 是一個變量,它的值可以隨時被改變 - 聲明它需要用不同的關鍵字: var。

要做到這一點,初始化 totalTeam 使用以下行來替換之前的聲明:

var totalTeam = tutorialTeam + editorialTeam

現在它能正常工作了!可能就會像你自己認為的那樣了,“為什麼不使用var聲明一切呢,無需有那麼多的限製?”

好吧,使用 let 來聲明一個常量是最好的做法,因為這允許編譯器進行優化。所以請記住:儘可能使用 let 來聲明常量!

顯式與推斷輸入

到目前為止,還冇有明確設置這些常量和變量的類型,因為編譯器有足夠的信息來自動推斷出它。

例如,設置 tutorialTeam 為 56,編譯器知道56是一個int類型,所以它會自動設置oftutorialTeam類型為int。

但是,如果你想要也可以設置明確類型。嘗試通過設置tutorialTeam的類型如以下的行:

let tutorialTeam: Int = 60

如果不知道明確類型,或者讓編譯器推斷類型並自動設置。這是比較好的做法,可在自動情況下讓編譯器推斷出類型,因為這是 Swift 的主要優勢之一:簡潔,易於代碼閱讀。

因為這個,切換回之前的那行使用推斷輸入(自動識彆類型):

let tutorialTeam = 60

Swift基本類型和控製流

到目前為止,已經看到了 Int 的解釋,這是Swift用於整數值類型的例子,但是還有更多。

嘗試使用一些基本類型,下麵每個部分粘貼在 playground 的底部。

Floats 和 Doubles

let priceInferred = 19.99
let priceExplicit: Double = 19.99

有兩種類型的小數點值,如:Float 和 Double。Double有更多的精確度, 並且默認是十進製值。這意味著 priceInferred 是 Double  類型。

Bools

let onSaleInferred = true
let onSaleExplicit: Bool = false

請注意,在 Swift 中使用 true/false 作為布爾值(在 Objective-C 中使用 YES/NO ,所以它們有點不同)。

Strings

let nameInferred = "Whoopie Cushion"
let nameExplicit: String = "Whoopie Cushion"

字符串是如你所期望那樣,但請注意,不再像在 Objective-C 中使用 @ 符號了。

if語句和字符串插值

if onSaleInferred {
  println("\(nameInferred) on sale for \(priceInferred)!")
} else {
  println("\(nameInferred) at regular price: \(priceInferred)!")
}

這是一個if語句的一個例子,就像在其它的編程語言一樣。條件的括號是可選的,大括號是必需的,即使隻有1行語句。

這裡說明一個叫做字符串內插的新的技術的一個例子。在Swift中每當想要替換字符串中東西,隻需使用此語法:\(表達式)。

在這一點上,可以看到在側邊欄中 println 的結果,由於空間有限它可能不好看到。要查看輸出,將鼠標移動到該行,並單擊出現的眼珠子(圖標):

002b_Eyeball

還有一個可以看到輸出方法。去到Xcode的主菜單,然後選擇 View\Assistant Editor\Show Assistant Editor.

003_Assistant_Editor

助理編輯器會告訴你的代碼中任何println語句的結果,並將結果值顯示在一個方便的地方,這往往比使用鼠標放在每一行更容易。

這裡是本教學到這裡的 playground 文件 內容。

類與方法

在Swift開發中會創建類和方法,這是最常見的作法,讓我們來看看!

首先,刪除在playground文件的一切內容,以便可以在一個乾淨的文件中開始新的代碼編寫。

接下來,將創建一個小費計算器類,以幫助描繪餐廳。 一次添加一小塊代碼,在這裡將一步一步地解釋。

// 1
class TipCalculator {

}

要創建一個類,隻需在class關鍵字後輸入類的名稱。然後,類的主體使用一個大括號。

如果是繼承另一個類,使用一個 :符號,後麵是繼承的類的名稱。請注意,不一定需要繼承(不像在Objective-C,在那裡必須繼承NSObject 之類的東西或派生自NSObject)。

添加以下代碼在大括號內:

  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double

添加這些後會出現一些錯誤,但不用擔心,接下來很快就會解決這些問題。

這就是如何在一個類中創建屬性 – 和創建變量或常數的方式相同。在這裡,將創建三個常量的屬性 – 一個是法案的總額(稅後), 一個用於應用到法案的稅收比例,一個用於法案的小計(稅前)。

請注意,任何屬性當聲明它們時,聲明必須為它們設置初始值,或者在初始化時 –這就是為什麼當前會有錯誤。如果不希望為屬性設置初始值,必須聲明它們作為可選(更多,在未來的教學)。

在之前創建的塊之後添加代碼(花括號內):

  // 3
  init(total: Double, taxPct: Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }

這將為類創建一個初始化器並使用兩個參數。初始化器在 Swift 的名稱總是為 init – 但可以有多個(如果必要的話),可采用不同的參數。

請注意,這裡已經給這個方法使用了參數,與這個類的屬性的名稱相同。正因為如此,需要通過將自身前綴在屬性之前,以區分兩者

請注意,由於冇有 subtotal 屬性,所以不會有名稱衝突,不需要添加 self 關鍵字, 因為編譯器可以自動推斷。

注意: 如果想知道 subtotal = total / (tipPct + 1) 計算來自:
(subtotal * taxPct) + subtotal = total
subtotal * (taxPct + 1) = total
subtotal = total / (taxPct + 1)

在先前代碼塊後添加代碼(花括號內):

  // 4
  func calcTipWithTipPct(tipPct: Double) -> Double {
    return subtotal * tipPct
  }

要定義一個方法, 可以使用 func 關鍵字. 然後列出參數(必須明確類型), 添加 -> 符號, 最後列出了返回類型。

這是一個函數,確定給小費的金額,這很簡單,隻要通過百分比乘以小計就可以得到結果。

在先前塊之後添加代碼(花括號內):

  // 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }

這是新的方法用於打印出三個可能的小費。

需要注意的是,當調用一個類的實例方法,第一個參數不需要命名(但其餘要)。

另外,還要注意字符串插值是如何不限於打印輸出變量。可以使用各種複雜的方法調用和操作,但需要正確的內聯!

添加以下代碼到playground(大括號之後)的底部:

// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

最後,創建小費計算器的實例,並調用方法打印可能小費。

這是到目前為止整個 playground 文件的全部代碼:

// 1
class TipCalculator {
 
  // 2
  let total: Double
  let taxPct: Double
  let subtotal: Double
 
  // 3
  init(total: Double, taxPct: Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }
 
  // 4
  func calcTipWithTipPct(tipPct: Double) -> Double {
    return subtotal * tipPct
  }
 
  // 5
  func printPossibleTips() {
    println("15%: \(calcTipWithTipPct(0.15))")
    println("18%: \(calcTipWithTipPct(0.18))")
    println("20%: \(calcTipWithTipPct(0.20))")
  }
 
}
 
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.printPossibleTips()

查看助理編輯器的結果:

004_Tip_Results

數組和For循環

目前,在上麵的代碼中有一些重複,因為調用 calcTipWithTotalmethod 幾次來計算不同比例的小費。 這裡可以通過使用一個數組來減少重複。

替換 printPossibleTips 如以下內容:

let possibleTipsInferred = [0.15, 0.18, 0.20]; // 小費比例數組列表
let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]; // 小費比例數組列表

這說明創建double類型數組,既有推斷,又有顯式類型的例子(同時創建隻是用於演示目的)。需要注意的是[Double]是Array<Double>的快捷方式。

然後下麵添加這些行:

for possibleTip in possibleTipsInferred {
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

枚舉遍曆數組中的項與Objective-C相似,快速枚舉- 請注意,不需要括號!

自己可編寫類似這樣的循環(但是目前這個語法是首選的風格):

for i in 0..< possibleTipsInferred.count {
  let possibleTip = possibleTipsInferred[i]
  println("\(possibleTip*100)%: \(calcTipWithTipPct(possibleTip))")
}

..< 運算符是一個非包函範圍運算符,不包括上限值。還有一個運算符 ... 它具有包容性。

數組通過 count 屬性來計算數組中的項目總數。也可以查找數組中特定項,通過語法 arrayName[index] 定義,如在這裡看到。

字典

讓我們做最後一次改變小費計算器。不是簡單地打印出小費,可以將結果返回為字典。 這將使結果更容易顯示在某種用於該應用的用戶界麵。

刪除printPossibleTips方法,並將它替換為以下代碼:

// 1
func returnPossibleTips() -> [Int: Double] {
 
  let possibleTipsInferred = [0.15, 0.18, 0.20]
  let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]
 
  // 2
  var retval = [Int: Double]()
  for possibleTip in possibleTipsInferred {
    let intPct = Int(possibleTip*100)
    // 3
    retval[intPct] = calcTipWithTipPct(possibleTip)
  }
  return retval
 
}

這會得到一個錯誤在 playground 中,但很快就會解決了。

首先讓我們通過以上部分的代碼段:

  1. 在這裡,標記方法返回字典,其中關鍵是int(尖端百分比為int,如15或20),並且該值是一個 Double(所計算的小費)。需要注意的是 [Int: Double]  隻是 Dictionary<Int, Double> 一個快捷方式。
  2. 這顯示如何創建一個空的字典。請注意,因為正在此詞典,需要聲明它作為一個變量(使用var),而不是一個常量(使用let)。 否則,會得到一個編譯錯誤。
  3. 這就是在字典中設置項目。 正如所看到的,它類似於Objective-C的字麵量語法。

最後,修改 playground 文件的最後一行來調用這個方法(此修複錯誤):

tipCalc.returnPossibleTips()

當 playground 評估計算,應該能看到結果為字典(點擊眼球的擴展視圖,並使用下箭頭展開)。

005b_Expanded_View

就是這樣 - 恭喜,一個用Swift編寫的全功能小費計算器已經完成!

下麵是本教學所有最終 playground 文件的代碼內容:

// 1
class TipCalculator {
// 2
  let total: Double
  let taxPct: Double
  let subtotal: Double
  // 3
  init(total: Double, taxPct: Double) {
    self.total = total
    self.taxPct = taxPct
    subtotal = total / (taxPct + 1)
  }

  // 4
  func calcTipWithTipPct(tipPct: Double) -> Double {
    return subtotal * tipPct
  }
  // 1
  func returnPossibleTips() -> [Int: Double] {
     let possibleTipsInferred = [0.15, 0.18, 0.20]
     let possibleTipsExplicit:[Double] = [0.15, 0.18, 0.20]
    // 2
   var retval = [Int: Double]()
    for possibleTip in possibleTipsInferred {
      let intPct = Int(possibleTip*100)
      // 3
      retval[intPct] = calcTipWithTipPct(possibleTip)
    }
    return retval   
  }
}
// 6
let tipCalc = TipCalculator(total: 33.25, taxPct: 0.06)
tipCalc.returnPossibleTips() 
}

本教學最終的playground文件代碼下載:SwiftTutorial-Demo2.playground4.zip