作者: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 的新特性。請繼續關注!