寫給初學(xué)者的 Swift 教程 Part 1

作者: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)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仲翎,一起剝皮案震驚了整個(gè)濱河市痹扇,隨后出現(xiàn)的幾起案子铛漓,更是在濱河造成了極大的恐慌,老刑警劉巖鲫构,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浓恶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡结笨,警方通過(guò)查閱死者的電腦和手機(jī)包晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)炕吸,“玉大人伐憾,你說(shuō)我怎么就攤上這事∷阃荆” “怎么了塞耕?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嘴瓤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)莉钙,這世上最難降的妖魔是什么廓脆? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮磁玉,結(jié)果婚禮上停忿,老公的妹妹穿的比我還像新娘。我一直安慰自己蚊伞,他們只是感情好席赂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著时迫,像睡著了一般颅停。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掠拳,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天癞揉,我揣著相機(jī)與錄音,去河邊找鬼溺欧。 笑死喊熟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姐刁。 我是一名探鬼主播芥牌,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼聂使!你這毒婦竟也來(lái)了壁拉?” 一聲冷哼從身側(cè)響起谬俄,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扇商,沒(méi)想到半個(gè)月后凤瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡案铺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蔬芥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片控汉。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笔诵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姑子,到底是詐尸還是另有隱情乎婿,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布街佑,位于F島的核電站谢翎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏沐旨。R本人自食惡果不足惜森逮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磁携。 院中可真熱鬧褒侧,春花似錦、人聲如沸谊迄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)统诺。三九已至歪脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篙议,已是汗流浹背唾糯。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鬼贱,地道東北人移怯。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像这难,于是被迫代替她去往敵國(guó)和親舟误。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容