作者:Thomas Hanning雷蹂,原文鏈接,原文日期:2015-10-29
譯者:小鐵匠Linus朵你;校對(duì):千葉知風(fēng)崭添;定稿:numbbbbb
Swift 是蘋果官方新推出的編程語(yǔ)言,它可以為 iOS吭历、 watchOS堕仔、 tvOS 和 Mac OS 開發(fā)應(yīng)用。在本教程中晌区,你將會(huì)學(xué)到所有的基礎(chǔ)操作摩骨。
你將在這個(gè)“Swift 初學(xué)者教程”中學(xué)到些什么呢?
本教程包含了以下這些話題:
- 下載 Xcode
- Playgrounds
- Hello World!
- 變量
- 常量
- 類型標(biāo)注
- 條件語(yǔ)句
- 循環(huán)語(yǔ)句
- 可選類型
- 函數(shù)
將會(huì)有更多內(nèi)容出現(xiàn)在“寫給初學(xué)者的 Swift 教程”系列中朗若。
下載 Xcode
成為 Swift 大牛的第一步當(dāng)然是下載 Xcode 啦恼五。你可以直接從 App Store 里下載。Xcode 是蘋果官方的 IDE 工具哭懈,它可以為 iOS灾馒、 watchOS、 tvOS 和 Mac OS 這些平臺(tái)開發(fā)應(yīng)用遣总。
Playgrounds
你會(huì)把大部分編程的時(shí)間花在具體項(xiàng)目上睬罗。但是,Xcode 有一個(gè)非常有趣的特性旭斥,可以給初學(xué)者和大牛帶來(lái)巨大幫助容达,它就是 Playgrounds。你可以在 Playground 里寫 Swift 代碼琉预,寫完就直接能看到執(zhí)行的結(jié)果董饰。因此,如果你想要學(xué)一些新特性或試驗(yàn)一些新功能圆米,可以打開 Playground 直接編寫卒暂,不用像在工程里那樣先編譯再執(zhí)行。
如果你正在寫一個(gè)項(xiàng)目娄帖,那也可以同時(shí)打開一個(gè) Playground也祠,你可以在 Playground 里快速試驗(yàn)一些小功能。
言歸正傳近速,講講如何使用 Playground诈嘿。第一步打開 Xcode,接著在歡迎界面點(diǎn)擊“Get started with a playground”削葱。如果你沒(méi)有看到這個(gè)歡迎界面奖亚,可以按 File -> New -> Playground 這樣的路徑打開 Playground。指定 Playground 的文件名和保存位置之后析砸,你就可以開始寫代碼啦昔字。
Hello World!
在大多數(shù)的編程書籍中,都把打印“Hello World!”作為第一個(gè)項(xiàng)目首繁。我們也不會(huì)打破這個(gè)傳統(tǒng)的作郭,哈哈陨囊。
因此,我們?cè)?playground 里寫下如下代碼:
print("Hello World!")
輸完這行代碼夹攒,你就可以在 playground 的右邊看到輸出的結(jié)果蜘醋。
恭喜,你已經(jīng)成功編寫了第一個(gè) Swift 程序咏尝!
變量
在打印出第一句代碼后压语,我們可以開始真正的編程啦。你需要從變量開始状土。變量可以存儲(chǔ)一個(gè)值无蜂,比如數(shù)字或字符串∶晌剑可以使用var
關(guān)鍵字來(lái)定義變量:
var aNumber = 5
這樣斥季,我們就有了一個(gè)叫aNumber
的變量,它的值為 5累驮。接著酣倾,我們可以嘗試著改變這個(gè)變量的值:
aNumber = 10
我們也可以把一個(gè)數(shù)學(xué)表示式的結(jié)果存到這個(gè)變量里:
aNumber = 5 + 6
當(dāng)然也可以把變量的值打印出來(lái),這需要用到特殊的術(shù)語(yǔ)谤专,如下:
print("The number is equal \(aNumber)")
變量可以有不同的類型躁锡。你可以為變量指定類型,比如字符串置侍、浮點(diǎn)數(shù)或者布爾值:
var aString = "A String"
var aDoble = 13.3
var aBool = true
但是映之,一旦你給變量賦了某一類型的值之后,就只能為變量賦相同類型的值了:
aBool = "A String" //編譯錯(cuò)誤
編譯器是一段可以把你寫的代碼翻譯成機(jī)器碼的程序蜡坊。如果你寫了一段編譯器不能理解或者違反編程規(guī)則的代碼杠输,編譯器就會(huì)報(bào)錯(cuò)。
常量
顧名思義秕衙,變量的值是可以改變的蠢甲,而常量的值在第一次賦值后就不能修改了。對(duì)于常量据忘,你可以使用關(guān)鍵字let
來(lái)定義:
let aConstantNumber = 10
如果你嘗試修改一個(gè)常量的值鹦牛,就會(huì)報(bào)錯(cuò):
aConstantNumber = 10 //編譯出錯(cuò)
那為什么還要有常量呢?因?yàn)橛碌酰袝r(shí)候并不希望一個(gè)值在第一次賦值后被修改曼追,比如,在指定一個(gè)人的姓名后汉规,就不希望這個(gè)值被再次修改拉鹃。
類型標(biāo)注
我們已經(jīng)知道,變量在第一次賦值之后會(huì)確定類型鲫忍。當(dāng)然膏燕,我們也可以在賦值時(shí)直接指定變量或常量的類型:
let aNumber: Int = 10
這個(gè)代碼的結(jié)果和之前的是一樣的,但是現(xiàn)在這段代碼更加容易讀懂悟民。第一眼就知道這個(gè)變量的類型是Int
坝辫。當(dāng)然, 除了Int
射亏,還有許多其他的類型:
var aString: String = "A String"
var aDouble: Double = 13.3
var aBool: Bool = true
條件語(yǔ)句
一個(gè)程序如果總是做相同的事情近忙,這很無(wú)聊。因此智润,出現(xiàn)了所謂的條件語(yǔ)句來(lái)控制程序的流向及舍。比如,你想要根據(jù)計(jì)算的結(jié)果有不同的輸出窟绷。能控制程序流向的锯玛,也是最普遍的條件語(yǔ)句是if
條件語(yǔ)句,舉例如下:
var number1 = 5
var number2 = 10
if number1 < number2 {
print("number1 is smaller than number2")
}
在這段示例代碼中兼蜈,我們通過(guò)if
條件語(yǔ)句來(lái)判斷number1
是否小于number2
攘残。如果滿足這個(gè)條件的話,程序就會(huì)執(zhí)行到大括號(hào)括起來(lái)的 if 代碼塊里为狸。你也可以在代碼塊里添加你想要執(zhí)行的代碼歼郭。
另外,你還可以在if
條件判斷返回false
的代碼塊里寫相應(yīng)代碼:
var number1 = 5
var number2 = 10
if number1 < number2 {
print("number1 is smaller than number2")
} else {
print("number1 is not smaller than number2")
}
當(dāng)然辐棒,你可以寫多個(gè)if
條件語(yǔ)句:
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 里另外一種條件語(yǔ)句是switch
條件語(yǔ)句病曾。switch
語(yǔ)句的形式就是把某個(gè)值與一個(gè)或若干個(gè)值作比較,例子如下:
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
關(guān)鍵字后寫上需要匹配的值name
漾根。然后泰涂,每個(gè)case
后跟上可能匹配的值。如果name
匹配了某一個(gè)值立叛,對(duì)應(yīng)case
里的代碼將被執(zhí)行负敏;否則,繼續(xù)進(jìn)行匹配秘蛇。假如沒(méi)有一個(gè)值能夠匹配其做,就會(huì)執(zhí)行default
后的代碼。對(duì)于初學(xué)者來(lái)說(shuō)赁还,知道switch
條件語(yǔ)句有很多可能匹配的值就足夠了妖泄。
循環(huán)
除了條件語(yǔ)句意外,還有一個(gè)控制程序流的重要結(jié)構(gòu):循環(huán)艘策。循環(huán)的作用主要是能多次執(zhí)行代碼塊里的代碼蹈胡。Swift 有三種循環(huán)的類型:while 循環(huán), repeat-while 循環(huán)和 for 循環(huán).
while 循環(huán)
下面的例子使用了 while 循環(huán):
var i = 0
while (i < 10) {
print("Hello World")
i = i + 1
}
while 循環(huán)以while
關(guān)鍵字開始,在while
關(guān)鍵字后跟上判斷條件。如果條件為 true罚渐,會(huì)重復(fù)運(yùn)行代碼塊里的一系列代碼却汉,比如本例子里的循環(huán)打印"Hello World"十次。如果沒(méi)有修改變量i
的值荷并,循環(huán)將一直進(jìn)行下去合砂。
repeat-while 循環(huán)
repeat-while 循環(huán)和 while 循環(huán)很相似。但是源织,不再像 while 循環(huán)那樣先判斷循環(huán)條件翩伪,例子如下:
var i = 10
repeat {
print("Hello World")
i = i + 1
} while (i < 10)
為什么要使用repeat-while 循環(huán)而不是 while 循環(huán)?repeat-while 循環(huán)和 while 循環(huán)的主要區(qū)別是在判斷循環(huán)條件之前谈息,先執(zhí)行一次循環(huán)的代碼塊缘屹。
var i = 11
repeat {
print("Hello World")
i = i + 1
} while (i < 10)
上面這個(gè)例子中,盡管判斷條件永遠(yuǎn)是 false侠仇,但是還是會(huì)打印一次“Hello World”轻姿。因此,有時(shí)候需要先判斷傅瞻,而有時(shí)候不想要先判斷踢代,這就要根據(jù)具體的情況決定到底使用哪種循環(huán)。
for 循環(huán)
for 循環(huán)很好用嗅骄,它可以對(duì)一個(gè)集合里面的每個(gè)元素執(zhí)行一系列語(yǔ)句胳挎。同時(shí),也有好幾種遍歷的方式溺森,先來(lái)看一個(gè)例子:
for i in 1...10 {
print("This iteration number \(i)")
}
如果像上面的例子一樣使用三個(gè)點(diǎn)號(hào)(閉區(qū)間操作符)的話慕爬,最后一個(gè)數(shù)字(10)也會(huì)被包含。此外屏积,也可以像下面的例子一樣使用:
for i in 1..<10 {
print("This iteration number \(i)")
}
在上面這個(gè)例子中医窿,最后一個(gè)數(shù)字(10)不會(huì)被包含進(jìn)去。另外炊林,還有一種方式可以寫 for 循環(huán)姥卢,就是標(biāo)準(zhǔn) C 樣式的 for 循環(huán):
for var i = 1; i <= 10; i++ {
print("This iteration number \(i)")
}
這個(gè)循環(huán)會(huì)執(zhí)行十次。分號(hào)將循環(huán)的定義分為 3 個(gè)部分:首先渣聚,循環(huán)首次啟動(dòng)時(shí)独榴,變量會(huì)被初始化,并賦一個(gè)起始值奕枝;其次棺榔,條件判斷表達(dá)式被調(diào)用,如果表達(dá)式調(diào)用結(jié)果為true隘道,則會(huì)執(zhí)行大括號(hào)內(nèi)部的代碼症歇;最后郎笆,執(zhí)行所有語(yǔ)句之后,執(zhí)行遞增表達(dá)式忘晤,在本例中宛蚓,變量i
每次增加 1。其中德频,i++
等同于i = i + 1
苍息。
可選類型
可選類型是 Swift 里很特殊的新特性,它非常重要壹置,因此我們?cè)谝婚_始就要介紹它。試想一下表谊,一個(gè)變量有可能沒(méi)有值钞护,比如,一個(gè)變量用來(lái)存儲(chǔ)一個(gè)人的 middle name爆办,那某人沒(méi)有 middle name 的話該怎么表示呢难咕?我們很自然的能想到賦值一個(gè)空字符串:
var middleName: String = ""
然而,如果我們讓middleName
成為可選類型距辆,我們就可以為變量指定表示“這里沒(méi)有值”的nil
余佃。可選類型的定義是在類型后面跟上問(wèn)號(hào):
var middleName: String? = nil
可選類型的變量可以有非空的值跨算。但是爆土,如果你像普通變量那樣訪問(wèn)可選類型的變量,就會(huì)編譯出錯(cuò):
var anotherName: String = middleName //編譯出錯(cuò)
你可以通過(guò)解包來(lái)訪問(wèn)诸蚕,使用感嘆號(hào)進(jìn)行解包:
var anotherName: String = middleName!
值得注意的是步势,如果你對(duì)一個(gè)非nil
的值進(jìn)行解包,可以得到具體的值背犯;否則坏瘩,就會(huì)在運(yùn)行時(shí)報(bào)錯(cuò),因?yàn)椴荒軐?duì)nil
進(jìn)行解包漠魏。
因此倔矾,最好在使用可選類型變量前先判斷是否是nil
,使用所謂的可選綁定(optional binding)就可以搞定了:
var middleName: String? = "John"
var anotherName: String = "Michael"
if let name = middleName {
anotherName = name
}
一開始柱锹,這段代碼可能看起來(lái)會(huì)有點(diǎn)奇怪哪自,實(shí)際上很簡(jiǎn)單,意思也很明確:如果middleName
等于nil
的話奕纫,對(duì)應(yīng)的代碼塊就不會(huì)執(zhí)行提陶。如果middleName
不等于nil
的話,變量name
就會(huì)獲得middleName
的值匹层,對(duì)應(yīng)的代碼塊就會(huì)被執(zhí)行隙笆。在代碼塊里锌蓄,name
就不再是可選變量了,因此可以給其他變量賦值撑柔。
函數(shù)
你可能經(jīng)常會(huì)遇到瘸爽,一些代碼可以應(yīng)用于許多不同的情況。而函數(shù)就是用來(lái)完成特定任務(wù)的獨(dú)立的代碼塊铅忿,并且當(dāng)函數(shù)需要執(zhí)行的時(shí)候剪决,這個(gè)名字會(huì)被用于“調(diào)用”函數(shù)。先從簡(jiǎn)單打印“Hello World”的函數(shù)開始吧:
func printHelloWorld() {
print("Hello World!")
}
事實(shí)上檀训,你把上面那段代碼寫到 playground 里柑潦,界面右邊是沒(méi)有輸出的。如果你通過(guò)下面的方式調(diào)用這個(gè)函數(shù)的話峻凫,就會(huì)有對(duì)應(yīng)的輸出了:
func printHelloWorld() {
print("Hello World!")
}
printHelloWorld()
如果你調(diào)用這個(gè)函數(shù)兩次的話渗鬼,你會(huì)看到界面右邊會(huì)出現(xiàn)兩次輸出:
func printHelloWorld() {
print("Hello World!")
}
printHelloWorld()
printHelloWorld()
你也可以給函數(shù)傳遞額外的信息,即傳遞參數(shù)荧琼。每個(gè)參數(shù)都需要指定參數(shù)名和類型譬胎,然后你就可以在函數(shù)里訪問(wèn)這些參數(shù)的值了:
func printANumber(number:Int) {
print("The number is \(number)")
}
現(xiàn)在稼钩,你就可以像下面的方式調(diào)用有參數(shù)的函數(shù)了:
func printANumber(number:Int) {
print("The number is \(number)")
}
printANumber(5)
本例中频敛,對(duì)應(yīng)的輸出就是:“The number is 5”。
你甚至可以指定多個(gè)參數(shù)侠驯。然后脐恩,你在調(diào)用函數(shù)時(shí)镐侯,除了不需要寫第一個(gè)參數(shù)的參數(shù)名之外,其他參數(shù)都需要寫參數(shù)名:
func printNumbers(number1:Int, number2:Int, number3:Int) {
print("The number are \(number1), \(number2), \(number3)")
}
printNumbers(5, number2:10, number3:15)
另外被盈,函數(shù)最重要的一點(diǎn)就是返回值析孽。如果需要函數(shù)有返回值,你就要指定返回值的類型只怎,同時(shí)袜瞬,返回值由return
關(guān)鍵字返回。
舉個(gè)例子:你需要寫一個(gè)函數(shù)身堡,實(shí)現(xiàn)返回兩個(gè)數(shù)字中更大者的功能邓尤。大體代碼如下:
func maxOfNumbers(number1: Int, number2: Int) -> Int {
if number1 < number2 {
return number2
} else {
return number1
}
}
maxOfNumbers(5, number2: 10)
輸出結(jié)果為 10。
接下來(lái)該干什么
現(xiàn)在已經(jīng)基本熟悉 Swift 中大部分的基本語(yǔ)法了贴谎。這對(duì)之后的學(xué)習(xí)是個(gè)很重要的基礎(chǔ)汞扎。接下來(lái)可以自己動(dòng)手在 Playground 里試著寫一些小功能,也可以看看關(guān)于本文知識(shí)點(diǎn)的其他文章:
在本系列的后續(xù)部分澈魄,我們會(huì)討論更多關(guān)于 Swift 的新特性。請(qǐng)繼續(xù)關(guān)注!