簡介
這是一個Swift語言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,會為你介紹Swift編程非常基礎的內容。從電腦如何工作的全程基本原理到語言結構,你會足夠了解這門語言,來處理數據和管理代碼的行為。
快速鏈接
- 一個下午讓你掌握Swift基礎 ( 1/9 ) 編程本質 & Playground基礎
- 一個下午讓你掌握Swift基礎 ( 2/9 ) 變量 & 常量
- 一個下午讓你掌握Swift基礎 ( 3/9 ) 數字類型 & 操作
- 一個下午讓你掌握Swift基礎 ( 4/9 ) 字符串
- 一個下午讓你掌握Swift基礎 ( 5/9 ) 做判斷
- 一個下午讓你掌握Swift基礎 ( 6/9 ) 重復步驟
- 一個下午讓你掌握Swift基礎 ( 7/9 ) 函數
- 一個下午讓你掌握Swift基礎 ( 8/9 ) 閉包
- 一個下午讓你掌握Swift基礎 ( 9/9 ) 可選值
- Swift 初學者 ( 10/12 ) 數組
- Swift 初學者 ( 11/12 ) 字典
- Swift 初學者 ( 12/12 ) 集合
打開Xcode,為你自己創建一個最原始的playground,命名為Tutorial2使用iOS平臺。把它保存在硬盤的某個位置,然后準備好開始今天的教程吧!
變量 & 常量
現在你知道了電腦是如何理解你寫的代碼的,也知道了該用什么工具來寫它,所以是時候開始學習Swift本身了。
這篇文章里,你會發現常量(constant)、變量(variable)、類型(type)和元組(tuples),學習怎么聲明他們、命名他們和改變他們。也會學習關于類型推斷(type inference),Swift最重要的特色之一,是一個會讓你的編程生涯變得簡單許多的特色。
命名數據
最簡單的電腦編程就只是有關操作數據的。記住,你在屏幕上看到的所有東西最后都會變成數字,你發送給CPU的數字。有些時候你自己會和不同類型的數字數據打交道,但其他時候數據會表現成一種更復雜的形式,例如文本(text)、圖像和集合(collections)。
在你的Swift代碼里,你可以給數據的每一小塊一個名字,稍后用來指向它。這個名字帶有一個相關類型,類型表示這個名字指向的是哪種數據:文本、數字、日期還是什么其他的。
你在這篇文章會學到一些基本類型,還有許多其他類型會在剩余的教程里穿插。
常量
看看,這是教程里出現的第一次Swift:
let number: Int = 10
這聲明了一個常量,叫做number,是Int類型的。然后把這個常量的值設置為數字10。
Int類型可以保存整數——就是數字啦。它被限制只能存儲整數,所以另有一種形式來保存小數。例如:
let pi: Double = 3.14159
這和Int常量很相似,除了名字和類型不同。這次常量是Double類型的,可以存儲高保真的小數,也就是能夠存儲的小數位數很多。
也有一個類型叫Float,floating point(浮點)的縮寫,也是保存小數,但比Double要低保真。一個Float數字占用的內存比Double要少,但講道理,數字用的內存根本不是一個大問題,你會看到大部分地方用的都是Double。
聲明好一個常量后,就不能改變它的數據了。例如下面的代碼:
let number: Int = 10 number = 0
這個代碼會產生一個error(錯誤):
Cannot asign to value: 'number' is a 'let' constant(無法分配值,'number'是一個'let'常量)
在Xcode里,你會看到error這樣顯示:
常量對于不會改變的值來說很有用處。如果你在做一個模型飛機,需要保持追蹤所有可用座位的個數,你就要用常量。
常量也可以用作一個人的年齡。盡管年齡會隨著生日到來而改變,但你應該只會關心他在這個特定時刻的年齡。
變量
有時候你想改變名字后面代表的數據。例如,如果你想追蹤銀行賬戶的存款和取款,你更應該用變量而不是一個常量。
如果你的程序數據從不改變,那肯定是一個無聊的程序!但你已經看到了,改變常量后面的數據是不可能的。
當你知道你需要改變一些數據的時候,就應該用變量來表示那個數據,而不是常量。用相似的方式來聲明變量,像這樣:
var variableNumber: Int = 42
只有狀態的第一部分有所不同:用let聲明常量,而用var聲明變量。
聲明好變量之后,想怎么改變它都可以,只要類型仍然是相同的就可以。例如,要改變生面聲明的變量,可以這樣做:
var variableNumber: Int = 42 variableNumber = 0 variableNumber = 1_000_000
要改變變量,簡單地設置它和一個新值相等。
注意:Swift里,可以選擇性地使用下劃線來讓大數字看起來更可讀。下劃線的數量和位置由你來定。
是時候介紹playground的結果邊欄了。當你把上面的代碼輸入到playground里后,你會看到右側的結果邊欄在每一行顯示variableNumber的當前值:
結果邊欄會在每一行顯示一個相關結果,如果存在的話。在變量或常量的例子里,結果會是新的值,不論你是剛剛聲明了一個常量,還是聲明或重新賦值了一個變量。
命名
總是要嘗試為變量和常量選擇有意義的名字。
好的名字能特別描述出變量或常量代表什么。這是一些好名字的例子:
- personAge
- numberOfPeople
- gradePointAverage
壞名字通常是因為描述性不夠。這是一些壞名字的例子:
- a
- temp
- average
秘訣就是確保你后面再讀它的時候還能理解變量或常量指的是什么。不要錯以為你有絕對可靠的記憶!在電腦編程里早的話在一兩天后回看代碼就忘記了它是做什么的是很平常的。通過給變量和常量簡便的、清晰的名字會讓自己更好過一點。
在Swift里,你甚至能用全部Unicode字符。這意味著你能像這樣聲明變量:
var ????: Int = -1
這看起來可能很好笑,但用這樣的特殊字符的時候還是要慎重。他們輸入起來很困難,因此可能會導致更多的痛苦而不是快樂。
像這樣的特殊字符在存儲的數據里可能比在Swift代碼里會更有意義;你在第4篇教程里會學習到更多關于Unicode的內容,“字符串。”
類型轉換
有時候你的數據是一種格式,但需要轉換到另一種格式。天真的辦法就是這樣做:
var integer: Int = 100 var decimal: Double = 12.5 integer = decimal
如果你真的這么做了Swift會抱怨然后在第三行拋出一個錯誤:
Cannot assign a value of type 'Double' to a value of type 'Int'(不能把一個‘Double’值分配給'Int'類型)
有一些編程語言不像這么嚴格,會自動實施簡單的數字轉換,就像你剛剛做的這樣。然而,Swift是一門對類型要求非常嚴格的語言,不允許你分配一個類型的值給另一個類型的變量。
記住,電腦依賴咱們程序員來告訴他們該干嘛。Swift里,那就包括詳細表述類型轉換。如果你想讓轉換發生,就需要說出來!
不是簡單地賦值,而是需要明確說明你想轉換類型。要像這樣做:
var integer: Int = 100 var decimal: Double = 12.5 integer = Int(decimal)
第三行的賦值毫不含糊地告訴Swift你想從初始類型,Double,轉換到新的類型,Int。
注意:這個例子里,分配小數值給整數結果會導致損失精度:整數變量最終值是12而不是12.5。這就是為什么顯示轉換類型是這么重要。Swift希望確保你了解你在做什么,因為實施類型轉換是可能會導致丟失數據的。
迷你練習
如果你沒有在Xcode里跟著做完這些代碼,現在是時候創建一個新的playground然后嘗試幾個練習來測試一下自己了!
- 聲明一個叫做myAge的Int類型的常量,然后把它設置為你的年齡。
- 聲明一個叫做averageAge的Double類型變量。剛開始,把它設置為myAge;你會需要用顯示類型轉換來完成這個操作。然后,設置它為你的年齡和我自己的年齡23的平均值。只需要在腦中做這個計算就可以了——你會在接下來的教程里用Swift來做!
元組
有時候數據是一對一對的,或是個三胞胎。例如2D坐標系里的一對(x,y)坐標。相似的,一組3D坐標系的坐標由x值、y值和z值構成。
Swift里,你可以用一種很簡單的方式來表示像這樣相關的數據,那就是使用元組。
元組是表示任何類型由不止一個值組成的數據類型。元組里你想有多少個值就可以有多少個值。舉個例子,你可以定義一對每個坐標軸的值都是整數的2D坐標,像這樣:
let coordinates: (Int, Int) = (2, 3)
coordinates的類型是一個元組,包含兩個Int值。元組里的值的類型,在這個情況里是Int,被逗號間隔,用括號包圍。創建元組的代碼都是一樣的,每個值被逗號間隔,最外側被括號包圍。
相似的創建Double值的元組很簡單,像這樣:
let coordinates: (Double, Double) = (2.1, 3.5)
你也可以混合然后匹配類型來組成元組,像這樣:
let coordinates: (Double, Int) = (2.1, 3)
這是訪問元組里數據的方式:
let coordinates: (Int, Int) = (2, 3) let x: Int = coordinates.0 let y: Int = coordinates.1
你可以用編號提及元組的每個項目,通過它在元組里的位置,從零開始。所以這個例子里,x會等于2,y會等于3。
注意:從零開始是電腦編程里的慣例,叫做零索引(zero indexing)。你會在第10篇教程里再次看到,“數組”。
在前一個例子里,第一個值,在0位置,是x坐標,第二個值,在1位置,是y坐標,看起來都不那么直觀。這又一次說明總是用避免誤解的方式來命名變量是多么重要。
還好,Swift可以單獨命名元組的部分,這樣就能明確知道每部分代表什么了。舉個例子:
let coordinatesNamed: (x: Int, y: Int) = (2, 3)
這里代碼標注出了coordinatesNamed的類型,要為元組的每個部分包含一個標簽。
然后,當你需要訪問元組的各個部分的時候,你可以通過它的名字來訪問:
let x: Int = coordinatesNamed.x let y: Int = coordinatesNamed.y
這樣就很清楚了,理解起來也很簡單。往往命名元組組成部分比不命名要更有幫助。
如果你一次想訪問元組的多個部分,比如在上面的例子里,你也可以使用簡寫句法來更輕松地實現:
let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let (x, y, z) = coordinates3D
這樣聲明了三個新常量,x,y和z,并且按順序分配元組里的值給他們。代碼和下面的等效:
let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let x = coordinates3D.x let y = coordinates3D.y let z = coordinates3D.z
如果你想忽略元組中一個確定的元素,你可以替換相應的聲明部分為下劃線。例如,你如果你在做2D計算,所以希望忽略3D坐標系里的z坐標,所以你可以這么寫:
let (x, y, _) = coordinates3D
這行代碼只聲明了x和y。_是特定的,簡單的代表你現在要忽略這部分了。
注意:你會發現整個Swift中都可以用下劃線來忽略一個值。
迷你練習
- 聲明一個常量元組,包含三個Int值以及一個Double值。用這個來代表日期(月,日,年)以及那個日期的平均溫度。
- 改變元組來命名組成部分。給他們和包含的數據相關的名字:month, day, year以及averageTemerature。
- 在一行里讀取day和平均溫度到兩個常量里。你要用下劃線來忽略month和year。
- 直到現在,你只見過常量元組。但你也可以創建變量元組。把在上面練習里創建的元組改為變量,通過使用var而不是let。現在改變平均溫度到一個新的值。
類型推斷
每次你看到變量或常量被聲明,都會有一個關聯類型。直到你看見從元組中一次讀取多個值的語法才沒有。再看一下:
let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let (x, y, z) = coordinates3D
第二行沒有東西來指明x, y和z是Int類型的。所以Swift是怎么知道他們是Int類型的呢?
自己讀讀代碼,很明顯第二行創建的常量都是Int類型的。因為代碼聲明了由三個Int值組成的元組。
這說明了Swift編譯器也可以通過推理完成這個過程。不需要你告訴它類型——它自己能搞明白。機智!:]
除了元組的其他地方也可以丟掉類型,同樣能夠發生這一切。事實上,大部分情況下你都可以刪掉類型因為Swift已經知道了。
例如,看一下下面的常量聲明:
let typeInferredInt = 42
右手邊的值是一個整數類型。Swift也知道,所以它推斷這個常量的類型應該是Int。這個過程被認為是類型推斷(type inference),并且這是Swift作為一門語言的關鍵要素。
有時候檢查變量或常量被推斷的類型是有用的。在playground里按住Option鍵然后點擊變量或常量的名字就可以了。Xcode會像這樣顯示一個彈窗:
Xcode通過給你如果類型推斷的情況下你可能需要用到的聲明語句來告訴你推斷的類型。在這個例子了,類型就是Int。
其他類型也適用:
let typeInferredDouble = 3.14159
從這里能看出類型推斷不是什么魔法。Swift只是單純做了人類大腦做起來非常簡單的事情。不使用類型推斷的編程語言通常會讓人感覺很啰嗦,因為你每次都要很明顯的指出類型,當你在聲明變量或常量的時候。
注意:在后面的教程里,你會學習到更復雜的類型,有時候Swift就不能推斷出類型了。盡管這是非常罕見的情況,你會看到本教程中大部分代碼范例都用了類型推斷,除了我想為你特別指明這個類型。
迷你練習
- 創建一個常量元組包含兩個整數但不要寫類型。按住Option單擊檢查類型到底是不是(Int, Int)。
- 讀取上面創建的元組的第一個值到另一個常量里。再次不要寫新的常量的類型。再按住Option點擊查看常量的類型是不是Int。
關鍵點
- 常量和變量給了數據名字。
- 當你聲明好常量后,就不能改變它的數據了,但你能在任何時間改變變量的數據。
- 總是給變量和常量有意義的名字來避免自己和同事將來會頭疼。
- 可以使用元組把一組數據變成一個單獨的數據類型。
- 類型推斷可以讓你在Swift已經知道它的類型的情況下不用具體寫出類型。
接下來去哪兒?
現在你已經知道了變量和常量,是時候關注一下它們存儲在那里的數據了。在接下來兩篇文章里,你會學習到最通用的一些數據類型——字符串和數字——以及你能對他們做點什么。
挑戰
在結束之前,這是給你測試變量和常量知識的一些挑戰。你可以在playground里嘗試打出代碼來檢查你的答案。
A挑戰:你就是編譯器
下面哪個部分的代碼是有效的?
//1 var age = 25 age = 30
//2 let age = 25 age = 30
這是有效的代碼嗎?
let tuple: (day: Int, month: Int, year: Int) = (15, 8, 2015) let day = tuple.Day
B挑戰:輸出結果預言家
叫value的那個常量的類型是什么?
let tuple = (100, 1.5, 10) let value = tuple.1
叫month的常量的值是什么?
let tuple: (day: Int, month: Int, year: Int) = (15, 8, 2015) let month = tuple.month
介紹
歡迎來到Swift世界!Swift是一門蘋果在2014年夏天發布的編程語言。從那之后,Swift發布了一個主要的版本跳躍,成為了開始在蘋果平臺:iOS,OS X,watchOS和tvOS開發的最簡單的方式。
誰適合這篇教程
這篇教程適合懂一點編程、并且希望學習Swift的人。也許你已經為網站寫過一些JavaScript代碼,或者用Python寫過一些簡短的程序。這篇教程就是為你準備的!你會學習到編程的基本概念,同時也會成為Swift語言小能手。
如果你是赤裸裸的編程新手,這篇教程也是為你準備的!教程里貫穿有簡短的鍛煉和挑戰來給你一些編程練習,同時測試你的知識。
需要準備什么
要看這篇教程,你需要準備如下的東西:
- 一臺運行OS X El Captian(10.11)的Mac,帶有最新發布的更新并且安裝了安全補丁。這樣你才能夠安裝需要的開發工具:最新版本的Xcode。
- Xcode 7.3或更新的版本。Xcode是用Swift寫代碼的主要開發工具。最小也需要Xcode 7.3版本,因為那個版本包含Swift 2.2。你可以免費從Mac App Store下載Xcode的最新版本,這里:http://apple.co/1FLn51R。
如果你還沒有安裝Xcode最新版本,在繼續看下面的教程前要確定安裝。
如何使用這篇教程
每篇教程都會介紹觸手可及的話題理論,伴隨大量Swift代碼來示范在學習的實際的應用程序。
教程里的所有代碼都是平臺中立的;這意味著不是為iOS、OS X或任何其它平臺而特定。代碼在playgrounds里運行,你在本篇中已經學習了。
在剩下的教程里,你可以把代碼在自己的playground里輸入進去。這樣你就可以和代碼“玩耍”(play around),做一些改變立即就能看見代碼運行的結果。
剩下的教程里會貫穿實際小練習,都是簡短的練習,關于觸手可及的主題。每篇的末尾也有挑戰,會有編程問題也會有長一點的代碼練習來測試你的知識。做完就能掌握大部分的Swift基礎知識。
教程更新
教程會隨Swift語言的更新而更新,會發布在我的簡書和知乎專欄上,搜索“張嘉夫”即可關注我。
目錄
本教程從一些基礎工作開始來讓你起步:
- 第1篇,編程本質 & Playground基礎 - 這就是,到編程世界的入門介紹!你會從電腦和編程的預覽開始,然后剩余時間給Swift playground打個招呼。
- 第2篇,變量 & 常量 - 你會學習到變量和常量,這是用來存儲數據的“地方”。你也會學習數據類型以及Swift如何追蹤數據類型并在代碼中進行傳輸。
- 第3篇,數字類型 & 操作 - 你會從基礎的數字類型比如整形和浮點型數字開始,當然也包括布爾類型。也會看到一些在實際操作,從比較到算數操作如加減。
- 第4篇,字符串 - 用字符串來存儲文字-從按鈕里的文字到圖片的標注到這篇教程全部的文字,存儲這所有的一切!你會學習到string和character類型,以及基于這些類型的一些常見操作。
在腦海中有基礎數據類型后,就該用那些數據做一些事情了:
- 第5篇,做判斷 - 代碼不總是直接從頭運行到尾。你會學習在代碼里如何做判決并且設定情況來運行某段代碼。
- 第6篇,重復步驟 - 繼續不要讓代碼直線運行的主題,你會學習到如何使用循環來重復某些步驟。
- 第7篇,函數 - 函數是Swift中用來構建代碼的基礎建筑。你會學習到如何定義函數來分組代碼到可復用單元中。
- 第8篇,閉包(Closures) - 閉包和函數很接近。你會學習到如何使用它們來輕松傳遞代碼塊。
最后一篇會回到數據:
- 第9節,可選值 - 這篇講可選值,Swift中的一種特殊類型,表示既有可能是一個真實的值也有可能沒有值。這篇的最后你會知道為什么要用可選值以及如何安全地使用它們。
這些基礎會讓你快速開始Swift之路,做好接觸更高級編程主題的準備。