Swift教學
Swift快速入門
Swift簡介
Swift基礎
Swift常量和變量
Swift註釋
swift分號
Swift整數
Swift浮點數
Swift類型安全和類型推斷
swift數值型字面量
Swift數值型類型轉換
Swift類型別名
Swift布爾值
Swift元組
Swift可選類型
Swift斷言
Swift基本運算符
Swif哈希集合
Swift運算術語
Swift字典
Swift賦值運算符
Swift數值運算
Swift複合賦值
Swift比較運算
Swift三元條件運算
Swift區間運算符
Swift邏輯運算
Swift字符串和字符
Swift字符串字面量
Swift初始化空字符串
Swift字符串可變性
Swift字符串是值類型
Swift使用字符
Swift計算字符數量
Swift連接字符串和字符
Swift字符串插值
Swift比較字符串
Swift大寫和小寫字符串
Swift Unicode
Swift集合類型 (Collection Types)
Swift數組
Swift字典
Swift集合的可變性
Swift控制流
Swift For循環
Swift While循環
Swift條件語句
Swift控制轉移語句
Swift函數
Swift函數的定義與調用
Swift函數參數與返回值
Swift函數參數名稱
Swift函數類型
Swift嵌套函數
Swift閉包
Swift閉包表達式
Swift尾隨閉包
Swift捕獲值
Swift閉包是引用類型
Swift枚舉
Swift枚舉語法
Swift匹配枚舉值和Switch語句
Swift相關值
Swift原始值
Swift類和結構體
Swift類和結構體對比
Swift結構體和枚舉是值類型
Swift類是引用類型
Swift類和結構體的選擇
Swift集合(Collection)類型的賦值和拷貝行爲
Swift屬性
Swift存儲屬性
Swift計算屬性
Swift屬性監視器
Swift全局變量和局部變量
Swift類型屬性
Swift方法
Swift實例方法
Swift類型方法
Swift下標腳本
Swift下標腳本語法
Swift下標腳本用法
Swift下標腳本選項
Swift繼承
Swift定義一個基類
Swift子類生成
Swift重寫
Swift防止重寫
Swift構造過程
Swift存儲型屬性的初始賦值
Swift定製化構造過程
Swift默認構造器
Swift值類型的構造器代理
Swift類的繼承和構造過程
Swift通過閉包和函數來設置屬性的默認值
Swift析構過程
Swift析構過程原理
Swift析構函數操作
Swift自動引用計數
Swift自動引用計數的工作機制
Swift自動引用計數實踐
Swift類實例之間的循環強引用
Swift解決實例之間的循環強引用
Swift閉包引起的循環強引用
Swift解決閉包引起的循環強引用
Swift可選鏈
Swift可選鏈可替代強制解析
Swift爲可選鏈定義模型類
Swift通過可選鏈調用屬性
Swift通過可選鏈調用方法
Swift使用可選鏈調用子腳本
Swift連接多層鏈接
Swift鏈接可選返回值的方法
Swift類型轉換
Swift定義一個類層次作爲例子
Swift檢查類型
Swift向下轉型
Swift Any和AnyObject類型轉換
Swift嵌套類型
Swift嵌套類型實例
Swift嵌套類型的引用
Swift擴展
Swift擴展語法
Swift計算型屬性
Swift構造器
Swift方法擴展
Swift下標
Swift嵌套類型擴展
Swift協議
Swift協議的語法
Swift屬性要求
Swift方法要求
Swift突變方法要求
Swift協議類型
Swift委託(代理)模式
Swift在擴展中添加協議成員
Swift通過擴展補充協議聲明
Swift集合中的協議類型
Swift協議的繼承
Swift協議合成
Swift檢驗協議的一致性
Swift可選協議要求
Swift泛型
Swift泛型所解決的問題
Swift泛型函數
Swift類型參數
Swift命名類型參數
Swift泛型類型
Swift類型約束
Swift關聯類型
Swift Where語句
Swift高級運算符
Swift位運算符
Swift溢出運算符
Swift優先級和結合性
Swift運算符函數
Swift自定義運算符
Swift語法結構
Swift空白與註釋
Swift標識符
Swift關鍵字
Swift字面量
Swift運算符
Swift類型
Swift類型註解
Swift類型標識符
Swift元組類型
Swift函數類型(參數類型和返回值類型)
Swift數組類型
Swift可選類型(命名型類型)
Swift隱式解析可選類型
Swift協議合成類型
Swift元類型
Swift類型繼承子句
Swift類型推斷
Swift表達式
Swift前綴表達式
Swift二元表達式
Swift賦值表達式
Swift類型轉換運算符
Swift主表達式
Swift後綴表達式
Swift語句
Swift循環語句
Swift For語句
Swift分支語句
Swift帶標籤的語句
Swift聲明
Swift模塊範圍
Swift代碼塊
Swift引入聲明
Swift常量聲明
Swift類型的別名聲明
Swift函數聲明
Swift枚舉聲明
Swift結構體聲明
Swift類聲明
Swift協議聲明
Swift構造器聲明
Swift析構聲明
Swift擴展聲明
Swift下標腳本聲明
Swift運算符聲明
Swift變量聲明
Swift特性
Swift聲明特性
Swift類型特性
Swift模式
Swift通配符模式
Swift標識符模式
Swift值綁定模式
Swift元組模式
Swift枚舉用例模式
Swift類型轉換模式
Swift表達式模式
Swift泛型參數
Swift泛型形參子句
Swift開發環境設置
Swift基本語法
Swift數據類型
Swift變量
Swift常量
Swift字面量
Swift運算符
Swift比較運算符
Swift邏輯運算符
Swift位運算符
Swift賦值運算符
Swift範圍運算符
Swift其它運算符
Swift運算符優先級
Swift算術運算符
Swift if語句
Swift if...else語句
Swift if...else if...else語句
Swift嵌套 if 語句
Swift Switch語句
Swift決策
Swift for-in循環
Swift for循環
Swift while循環
Swift do...while循環
Swift continue語句
Swift break語句
Swift fallthrough語句
Swift循環
Swift字符串
Swift字符
Swift數組
Swift函數
Swift閉包
Swift枚舉
Swift結構體
Swift類
Swift 屬性
Swift 方法
Swift 下標
Swift 繼承
Swift初始化
Swift 反初始化
Swift ARC自動引用計數
Swift 可選鏈
Swift 類型轉換
Swift 擴展
Swift 協議
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.
Swift快速入門

命名文件爲 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 的結果,由於空間有限它可能不好看到。要查看輸出,將鼠標移動到該行,並單擊出現的眼珠子(圖標):
Swift快速入門

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

助理編輯器會告訴你的代碼中任何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()

查看助理編輯器的結果:
Swift快速入門

數組和For循環

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

替換 printPossibleTips 如以下內容:

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

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

然後下面添加這些行:

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 評估計算,應該能看到結果爲字典(點擊眼球的擴展視圖,並使用下箭頭展開)。
Swift快速入門

就是這樣 - 恭喜,一個用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