寫給初學者的 Swift 教程 Part 1

作者:Thomas Hanning,原文鏈接,原文日期:2015-10-29
譯者:小鐵匠Linus;校對:千葉知風;定稿:numbbbbb

Swift 是蘋果官方新推出的編程語言,它可以為 iOS、 watchOS、 tvOS 和 Mac OS 開發應用。在本教程中,你將會學到所有的基礎操作。

你將在這個“Swift 初學者教程”中學到些什么呢?

本教程包含了以下這些話題:

  • 下載 Xcode
  • Playgrounds
  • Hello World!
  • 變量
  • 常量
  • 類型標注
  • 條件語句
  • 循環語句
  • 可選類型
  • 函數

將會有更多內容出現在“寫給初學者的 Swift 教程”系列中。

下載 Xcode

成為 Swift 大牛的第一步當然是下載 Xcode 啦。你可以直接從 App Store 里下載。Xcode 是蘋果官方的 IDE 工具,它可以為 iOS、 watchOS、 tvOS 和 Mac OS 這些平臺開發應用。

Playgrounds

你會把大部分編程的時間花在具體項目上。但是,Xcode 有一個非常有趣的特性,可以給初學者和大牛帶來巨大幫助,它就是 Playgrounds。你可以在 Playground 里寫 Swift 代碼,寫完就直接能看到執行的結果。因此,如果你想要學一些新特性或試驗一些新功能,可以打開 Playground 直接編寫,不用像在工程里那樣先編譯再執行。

如果你正在寫一個項目,那也可以同時打開一個 Playground,你可以在 Playground 里快速試驗一些小功能。

言歸正傳,講講如何使用 Playground。第一步打開 Xcode,接著在歡迎界面點擊“Get started with a playground”。如果你沒有看到這個歡迎界面,可以按 File -> New -> Playground 這樣的路徑打開 Playground。指定 Playground 的文件名和保存位置之后,你就可以開始寫代碼啦。

Hello World!

在大多數的編程書籍中,都把打印“Hello World!”作為第一個項目。我們也不會打破這個傳統的,哈哈。

因此,我們在 playground 里寫下如下代碼:

print("Hello World!")

輸完這行代碼,你就可以在 playground 的右邊看到輸出的結果。

恭喜,你已經成功編寫了第一個 Swift 程序!

變量

在打印出第一句代碼后,我們可以開始真正的編程啦。你需要從變量開始。變量可以存儲一個值,比如數字或字符串。可以使用var關鍵字來定義變量:

var aNumber = 5

這樣,我們就有了一個叫aNumber的變量,它的值為 5。接著,我們可以嘗試著改變這個變量的值:

aNumber = 10

我們也可以把一個數學表示式的結果存到這個變量里:

aNumber = 5 + 6

當然也可以把變量的值打印出來,這需要用到特殊的術語,如下:

print("The number is equal \(aNumber)")

變量可以有不同的類型。你可以為變量指定類型,比如字符串、浮點數或者布爾值:

var aString = "A String"
var aDoble = 13.3
var aBool = true

但是,一旦你給變量賦了某一類型的值之后,就只能為變量賦相同類型的值了:

aBool = "A String" //編譯錯誤

編譯器是一段可以把你寫的代碼翻譯成機器碼的程序。如果你寫了一段編譯器不能理解或者違反編程規則的代碼,編譯器就會報錯。

常量

顧名思義,變量的值是可以改變的,而常量的值在第一次賦值后就不能修改了。對于常量,你可以使用關鍵字let來定義:

let aConstantNumber = 10

如果你嘗試修改一個常量的值,就會報錯:

aConstantNumber = 10 //編譯出錯

那為什么還要有常量呢?因為,有時候并不希望一個值在第一次賦值后被修改,比如,在指定一個人的姓名后,就不希望這個值被再次修改。

類型標注

我們已經知道,變量在第一次賦值之后會確定類型。當然,我們也可以在賦值時直接指定變量或常量的類型:

let aNumber: Int = 10

這個代碼的結果和之前的是一樣的,但是現在這段代碼更加容易讀懂。第一眼就知道這個變量的類型是Int。當然, 除了Int,還有許多其他的類型:

var aString: String = "A String"
var aDouble: Double = 13.3
var aBool: Bool = true

條件語句

一個程序如果總是做相同的事情,這很無聊。因此,出現了所謂的條件語句來控制程序的流向。比如,你想要根據計算的結果有不同的輸出。能控制程序流向的,也是最普遍的條件語句是if條件語句,舉例如下:

var number1 = 5
var number2 = 10
 
if number1 < number2 {
    print("number1 is smaller than number2")
}

在這段示例代碼中,我們通過if條件語句來判斷number1是否小于number2。如果滿足這個條件的話,程序就會執行到大括號括起來的 if 代碼塊里。你也可以在代碼塊里添加你想要執行的代碼。

另外,你還可以在if條件判斷返回false的代碼塊里寫相應代碼:

var number1 = 5
var number2 = 10
 
if number1 < number2 {
    print("number1 is smaller than number2")
} else {
    print("number1 is not smaller than number2")
}

當然,你可以寫多個if條件語句:

if number1 < number2 {
    print("number1 is smaller than number2")
} else if number2 < number1 {
    print("number2 is than number2")
} else {
    print("number1 is equal number2")
}

Swift 里另外一種條件語句是switch條件語句。switch語句的形式就是把某個值與一個或若干個值作比較,例子如下:

switch name {
case "Mick":
    print("The name is Mick")
case "John":
    print("The name is John")
default:
    print("The name is neither Mick nor John")
}

switch關鍵字后寫上需要匹配的值name。然后,每個case后跟上可能匹配的值。如果name匹配了某一個值,對應case里的代碼將被執行;否則,繼續進行匹配。假如沒有一個值能夠匹配,就會執行default后的代碼。對于初學者來說,知道switch條件語句有很多可能匹配的值就足夠了。

循環

除了條件語句意外,還有一個控制程序流的重要結構:循環。循環的作用主要是能多次執行代碼塊里的代碼。Swift 有三種循環的類型:while 循環, repeat-while 循環和 for 循環.

while 循環

下面的例子使用了 while 循環:

var i = 0

while (i < 10) {
    print("Hello World")
    i = i + 1
}

while 循環以while關鍵字開始,在while關鍵字后跟上判斷條件。如果條件為 true,會重復運行代碼塊里的一系列代碼,比如本例子里的循環打印"Hello World"十次。如果沒有修改變量i的值,循環將一直進行下去。

repeat-while 循環

repeat-while 循環和 while 循環很相似。但是,不再像 while 循環那樣先判斷循環條件,例子如下:

var i = 10
 
repeat {
    print("Hello World")
    i = i + 1
} while (i < 10)

為什么要使用repeat-while 循環而不是 while 循環?repeat-while 循環和 while 循環的主要區別是在判斷循環條件之前,先執行一次循環的代碼塊。

var i = 11
 
repeat {
    print("Hello World")
    i = i + 1
} while (i < 10)

上面這個例子中,盡管判斷條件永遠是 false,但是還是會打印一次“Hello World”。因此,有時候需要先判斷,而有時候不想要先判斷,這就要根據具體的情況決定到底使用哪種循環。

for 循環

for 循環很好用,它可以對一個集合里面的每個元素執行一系列語句。同時,也有好幾種遍歷的方式,先來看一個例子:

for i in 1...10 {
    print("This iteration number \(i)")
}

如果像上面的例子一樣使用三個點號(閉區間操作符)的話,最后一個數字(10)也會被包含。此外,也可以像下面的例子一樣使用:

for i in 1..<10 {
    print("This iteration number \(i)")
}

在上面這個例子中,最后一個數字(10)不會被包含進去。另外,還有一種方式可以寫 for 循環,就是標準 C 樣式的 for 循環:

for var i = 1; i <= 10; i++ {
    print("This iteration number \(i)")
}

這個循環會執行十次。分號將循環的定義分為 3 個部分:首先,循環首次啟動時,變量會被初始化,并賦一個起始值;其次,條件判斷表達式被調用,如果表達式調用結果為true,則會執行大括號內部的代碼;最后,執行所有語句之后,執行遞增表達式,在本例中,變量i每次增加 1。其中,i++等同于i = i + 1

可選類型

可選類型是 Swift 里很特殊的新特性,它非常重要,因此我們在一開始就要介紹它。試想一下,一個變量有可能沒有值,比如,一個變量用來存儲一個人的 middle name,那某人沒有 middle name 的話該怎么表示呢?我們很自然的能想到賦值一個空字符串:

var middleName: String = ""

然而,如果我們讓middleName成為可選類型,我們就可以為變量指定表示“這里沒有值”的nil。可選類型的定義是在類型后面跟上問號:

var middleName: String? = nil

可選類型的變量可以有非空的值。但是,如果你像普通變量那樣訪問可選類型的變量,就會編譯出錯:

var anotherName: String = middleName //編譯出錯

你可以通過解包來訪問,使用感嘆號進行解包:

var anotherName: String = middleName!

值得注意的是,如果你對一個非nil的值進行解包,可以得到具體的值;否則,就會在運行時報錯,因為不能對nil進行解包。

因此,最好在使用可選類型變量前先判斷是否是nil,使用所謂的可選綁定(optional binding)就可以搞定了:

var middleName: String? = "John"
var anotherName: String = "Michael"
 
if let name = middleName {
    anotherName = name
}

一開始,這段代碼可能看起來會有點奇怪,實際上很簡單,意思也很明確:如果middleName等于nil的話,對應的代碼塊就不會執行。如果middleName不等于nil的話,變量name就會獲得middleName的值,對應的代碼塊就會被執行。在代碼塊里,name就不再是可選變量了,因此可以給其他變量賦值。

函數

你可能經常會遇到,一些代碼可以應用于許多不同的情況。而函數就是用來完成特定任務的獨立的代碼塊,并且當函數需要執行的時候,這個名字會被用于“調用”函數。先從簡單打印“Hello World”的函數開始吧:

func printHelloWorld() {
    print("Hello World!")
}

事實上,你把上面那段代碼寫到 playground 里,界面右邊是沒有輸出的。如果你通過下面的方式調用這個函數的話,就會有對應的輸出了:

func printHelloWorld() {
    print("Hello World!")
}
 
printHelloWorld()

如果你調用這個函數兩次的話,你會看到界面右邊會出現兩次輸出:

func printHelloWorld() {
    print("Hello World!")
}
 
printHelloWorld()
printHelloWorld()

你也可以給函數傳遞額外的信息,即傳遞參數。每個參數都需要指定參數名和類型,然后你就可以在函數里訪問這些參數的值了:

func printANumber(number:Int) {
    print("The number is \(number)")
}

現在,你就可以像下面的方式調用有參數的函數了:

func printANumber(number:Int) {
    print("The number is \(number)")
}
 
printANumber(5)

本例中,對應的輸出就是:“The number is 5”。

你甚至可以指定多個參數。然后,你在調用函數時,除了不需要寫第一個參數的參數名之外,其他參數都需要寫參數名:

func printNumbers(number1:Int, number2:Int, number3:Int) {
    print("The number are \(number1), \(number2), \(number3)")
}
 
printNumbers(5, number2:10, number3:15)

另外,函數最重要的一點就是返回值。如果需要函數有返回值,你就要指定返回值的類型,同時,返回值由return關鍵字返回。

舉個例子:你需要寫一個函數,實現返回兩個數字中更大者的功能。大體代碼如下:

func maxOfNumbers(number1: Int, number2: Int) -> Int {
    if number1 < number2 {
        return number2
    } else {
        return number1
    }
}
 
maxOfNumbers(5, number2: 10)

輸出結果為 10。

接下來該干什么

現在已經基本熟悉 Swift 中大部分的基本語法了。這對之后的學習是個很重要的基礎。接下來可以自己動手在 Playground 里試著寫一些小功能,也可以看看關于本文知識點的其他文章:

在本系列的后續部分,我們會討論更多關于 Swift 的新特性。請繼續關注!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內容