Swift 4官方文檔中文版: The Basic(上)

Swift學(xué)習(xí)有問必答群 : 313838956 ( mac版QQ有權(quán)限要求, 入群只能通過手機(jī)版 QQ申請(qǐng)). 本群由Guards翻譯組創(chuàng)建并維護(hù)
入群須知:

0.0 重申: mac版QQ有權(quán)限要求, 入群只能通過手機(jī)版 QQ申請(qǐng).
0.1 群主晚上每天20點(diǎn)--21點(diǎn)定時(shí)回答Swift相關(guān)的問題.
0.2 群主會(huì)在看到問題后, 第一時(shí)間回復(fù)
0.3 拒絕長(zhǎng)時(shí)間潛水, 拒絕討論和Swift , iOS 無(wú)關(guān)的問題



該文章翻譯自Apple官方文檔: The Swift 4 Programming Language

Guards翻譯組 正在翻譯Swift 4的全套文檔, 這是該文檔第一章節(jié)的上半部分, 下半部分我們將于明天下午發(fā)布. 如果你感興趣, 可以關(guān)注我們的簡(jiǎn)書.
原文鏈接: The Basics

翻譯 : Nc (微博 簡(jiǎn)書)
翻譯 : **Aaron (微博)
校對(duì): ** August
(簡(jiǎn)書)

譯者心聲

我們會(huì)不定期的更新翻譯文章, 如有需求,可以關(guān)注我們的簡(jiǎn)書

我們是一群熱愛翻譯并且熱愛 Swift 的人, 希望通過自己的努力讓不熟悉英語(yǔ)的程序員也能學(xué)習(xí)到國(guó)外的高質(zhì)量的文章. 如發(fā)現(xiàn)文章中翻譯錯(cuò)誤之處, 煩請(qǐng)跟我們聯(lián)系, 我們第一時(shí)間更正.

想成為我們中一員? 是的, 我們正在招募對(duì)翻譯感興趣的小伙伴, 如果你想提高閱讀英語(yǔ)文檔的水平, 如果你不甘寂寞, 如果你想為廣大開發(fā)者做點(diǎn)事. QQ:869293399

Swift 是一門開發(fā) iOS, macOS, watchOS 和 tvOS 應(yīng)用的新語(yǔ)言。即便如此克锣,如果你有 C 或者 Objective-C 開發(fā)經(jīng)驗(yàn)俄占,你會(huì)發(fā)現(xiàn) Swift 的有很多你熟悉的內(nèi)容。Swift 提供了與 C 和 Objective-C 上所有基礎(chǔ)數(shù)據(jù)類型葡缰,如整型Int亏掀; 浮點(diǎn)型DoubleFloat; 布爾型值Bool泛释;文本型數(shù)據(jù)String 滤愕。 Swift 還提供了三個(gè)基本的集合類型,Array 怜校,SetDictionary 间影,詳見集合類型

和 C 語(yǔ)言類似茄茁,Swift 使用變量來(lái)進(jìn)行存儲(chǔ)并通過變量名來(lái)關(guān)聯(lián)對(duì)應(yīng)的值魂贬。在 Swift 中,不可變的變量非常常用裙顽,它們就是常量付燥,而且比 C 語(yǔ)言的常量更強(qiáng)大。在 Swift 中锦庸,如果你要處理的值不需要改變机蔗,那使用常量可以讓你的代碼更加安全并且更清晰地表達(dá)你的意圖。

除了我們熟悉的類型甘萧,Swift 還增加了 Objective-C 中沒有的高階數(shù)據(jù)類型, 比如元組Tuples萝嘁。元組可以讓你創(chuàng)建或者傳遞一組數(shù)據(jù),當(dāng)函數(shù)需要返回單一復(fù)合值時(shí)扬卷,你可以用一個(gè)元組可以返回多個(gè)值牙言。

Swift 還增加了Optional類型(譯者注: Optional類型即可選類型),用于處理值不存在的情況怪得≡弁鳎可選的意思是 “這里有一個(gè)值卑硫,并且它等于x ” 或 “這里沒有值” 〔隙希可選有點(diǎn)像在 Objective-C 中使用nil 欢伏,但是它可以用在任何類型上,不僅僅是類亿乳∠跖。可選類型比 Objective-C 中的 nil指針更加安全也更具表現(xiàn)力,它是 Swift 許多強(qiáng)大特性的重要組成部分葛假。
Swift 是一門類型安全的語(yǔ)言障陶,這意味著 Swift 可以讓你清楚地知道值的類型。如果你的代碼期望得到一個(gè)String 聊训,類型安全會(huì)阻止你錯(cuò)誤地傳入一個(gè)Int抱究。同樣的,如果你的代碼期望得到一個(gè) String带斑,類型安全會(huì)阻止你意外傳入一個(gè)可選的 String 鼓寺。類型安全可以幫助你在開發(fā)階段盡早發(fā)現(xiàn)并修正錯(cuò)誤。

常量和變量

常量和變量把一個(gè)名字(比如maximumNumberOfLoginAttempts或者 welcomeMessage)和一個(gè)指定類型的值(比如數(shù)字 10或者字符串"Hello")關(guān)聯(lián)起來(lái)遏暴。常量的值一旦設(shè)定就不能改變侄刽,而變量的值可以隨意更改。

聲明常量和變量

常量和變量必須在使用前聲明朋凉,用 關(guān)鍵字let來(lái)聲明常量和關(guān)鍵字 var來(lái)聲明變量州丹。下面的例子展示了如何用常量和變量來(lái)記錄用戶嘗試登錄的次數(shù):

  let maximumNumberOfLoginAttempts = 10
  var currentLoginAttempt = 0

這兩行代碼可以被理解為:
“聲明一個(gè)名字是maximumNumberOfLoginAttempts的新常量,并給它一個(gè)值 10杂彭。然后墓毒,聲明一個(gè)名字是currentLoginAttempt的變量并將它的值初始化為0 ”。

在這個(gè)例子中亲怠,允許的最大嘗試登錄次數(shù)被聲明為一個(gè)常量所计,因?yàn)檫@個(gè)值不會(huì)改變。當(dāng)前嘗試登錄次數(shù)被聲明為一個(gè)變量团秽,因?yàn)槊看螄L試登錄失敗的時(shí)候都需要增加這個(gè)值主胧。
你可以在一行中聲明多個(gè)常量或者多個(gè)變量,用逗號(hào)隔開:

  var x = 0.0, y = 0.0, z = 0.0

Note:如果你的代碼中有不需要改變的值习勤,請(qǐng)使用 let 關(guān)鍵字將它聲明為常量踪栋。只將需要改變的值聲明為變量。

類型標(biāo)注

當(dāng)你聲明常量或者變量的時(shí)候可以加上 類型標(biāo)注 (type annotation)图毕,說(shuō)明常量或者變量中要存儲(chǔ)的值的類型夷都。通過在常量或變量名后面接一個(gè)冒號(hào)來(lái)寫一個(gè)類型標(biāo)注,后跟一個(gè)空格予颤,后跟要使用的類型的名稱囤官。

這個(gè)例子給welcomeMessage 變量添加了類型標(biāo)注冬阳,表示這個(gè)變量可以存儲(chǔ) String類型的值:

   var welcomeMessage: String

聲明中的冒號(hào)代表著“xx是xx類型”,所以這行代碼可以被理解為:

  • 聲明一個(gè)類型為 String党饮,名字為welcomeMessage的變量肝陪。
  • 類型為 String ”的意思是“可以存儲(chǔ)任意 String 類型的值。

welcomeMessage 變量現(xiàn)在可以被正確地設(shè)置成任意字符串:

  welcomeMessage = "Hello"

你可以在一行中定義多個(gè)同樣類型的變量劫谅,用逗號(hào)分割见坑,并在最后一個(gè)變量名之后添加類型標(biāo)注:

  var red, green, blue: Double

Note:一般來(lái)說(shuō)你很少需要寫類型標(biāo)注嚷掠。如果你在聲明常量或者變量的時(shí)候賦了一個(gè)初始值捏检,Swift可以推斷出這個(gè)常量或者變量的類型,請(qǐng)參考類型安全和類型推斷不皆。在上面的例子中贯城,沒有給 welcomeMessage
賦初始值,所以變量 welcomeMessage
的類型是通過一個(gè)類型標(biāo)注指定的霹娄,而不是通過初始值推斷的能犯。

常量和變量的命名

你可以用任何你喜歡的字符作為常量和變量名,包括 Unicode 字符:

let π = 3.14159
let 你好 = "你好世界"
let  = "dogcow"

常量與變量名不能包含空格犬耻,數(shù)學(xué)符號(hào)踩晶,箭頭,保留的(或者非法的)Unicode 碼位枕磁,連線與制表符渡蜻。不能以數(shù)字開頭,但是可以在常量與變量名的其他地方包含數(shù)字计济。
一旦你將常量或者變量聲明為確定的類型茸苇,你就不能使用相同的名字再次進(jìn)行聲明,或者改變其存儲(chǔ)的值的類型沦寂。同時(shí)学密,你也不能將常量與變量進(jìn)行互轉(zhuǎn)。

Note:如果你需要使用與Swift保留關(guān)鍵字相同的名稱作為常量或者變量名传藏,你可以使用反引號(hào)(`)將關(guān)鍵字包圍的方式將其作為名字使用腻暮。無(wú)論如何,你應(yīng)當(dāng)避免使用關(guān)鍵字作為常量或變量名毯侦,除非你別無(wú)選擇哭靖。

你可以更改現(xiàn)有的變量值為其他同類型的值,在下面的例子中叫惊,friendlyWelcome的值從"Hello!"改為了"Bonjour!":

var friendlyWelcome = "Hello!"
friendlyWelcome = "Bonjour!"
// friendlyWelcome 現(xiàn)在是 "Bonjour!"

與變量不同款青,常量的值一旦被確定就不能更改了。嘗試這樣做會(huì)導(dǎo)致編譯時(shí)報(bào)錯(cuò):

let languageName = "Swift"
languageName = "Swift++"
// 這會(huì)報(bào)編譯時(shí)錯(cuò)誤 - languageName 不可改變

輸出常量和變量

你可以用print(_:separator:terminator:)
函數(shù)來(lái)輸出當(dāng)前常量或變量的值:

print(friendlyWelcome)// 輸出 "Bonjour!"

print(_:separator:terminator:)是一個(gè)用來(lái)輸出一個(gè)或多個(gè)值到適當(dāng)輸出區(qū)的全局函數(shù)霍狰。在 Xcode中抡草,print(_:separator:terminator:)將會(huì)輸出內(nèi)容到“console”面板上饰及。separatorterminator參數(shù)具有默認(rèn)值,因此你調(diào)用這個(gè)函數(shù)的時(shí)候可以忽略它們康震。默認(rèn)情況下燎含,該函數(shù)通過添加換行符來(lái)結(jié)束當(dāng)前行。如果不想換行腿短,可以傳遞一個(gè)空字符串給 terminator 參數(shù)--例如屏箍,print(someValue, terminator:"")
。關(guān)于參數(shù)默認(rèn)值的更多信息橘忱,請(qǐng)參考默認(rèn)參數(shù)值赴魁。

Swift 用字符串插值(string interpolation)的方式把常量名或者變量名當(dāng)做占位符加入到長(zhǎng)字符串中,Swift 會(huì)用當(dāng)前常量或變量的值替換這些占位符钝诚。將常量或變量名放入圓括號(hào)中颖御,并在開括號(hào)前使用反斜杠將其轉(zhuǎn)義:

print("The current value of friendlyWelcome is \(friendlyWelcome)")
// 輸出 "The current value of friendlyWelcome is Bonjour!

Note:字符串插值所有可用的選項(xiàng),請(qǐng)參考字符串插值凝颇。

注釋

請(qǐng)將你的代碼中的非執(zhí)行文本注釋成提示或者筆記以方便你將來(lái)閱讀潘拱。Swift 的編譯器將會(huì)在編譯代碼時(shí)自動(dòng)忽略掉注釋部分。
Swift 中的注釋與 C 語(yǔ)言的注釋非常相似拧略。單行注釋以雙正斜杠 (//)
作為起始標(biāo)記:

  // 這是一個(gè)注釋

行注釋的起始標(biāo)記為單個(gè)正斜杠后跟隨一個(gè)星號(hào)(/*)芦岂,終止標(biāo)記為一個(gè)星號(hào)后跟隨單個(gè)正斜杠(*/):

/* 這是一個(gè),多行注釋 */

與 C 語(yǔ)言多行注釋不同,Swift 的多行注釋可以嵌套在其它的多行注釋之中垫蛆。你可以先生成一個(gè)多行注釋塊禽最,然后在這個(gè)注釋塊之中再嵌套成第二個(gè)多行注釋。終止注釋時(shí)先插入第二個(gè)注釋塊的終止標(biāo)記月褥,然后再插入第一個(gè)注釋塊的終止標(biāo)記:

/* 這是第一個(gè)多行注釋的開頭
/* 這是第二個(gè)被嵌套的多行注釋 */
  這是第一個(gè)多行注釋的結(jié)尾 */

通過運(yùn)用嵌套多行注釋弛随,你可以方便快速的注釋掉一大段代碼,即使這段代碼之中已經(jīng)含有了多行注釋塊宁赤。

分號(hào)

與其他大部分編程語(yǔ)言不同舀透,Swift 并不強(qiáng)制要求你在每條語(yǔ)句的結(jié)尾處使用分號(hào)(;),當(dāng)然决左,你也可以按照你自己的習(xí)慣添加分號(hào)愕够。有一種情況下必須要用分號(hào),即你打算在同一行內(nèi)寫多條獨(dú)立的語(yǔ)句:

let cat = ""; 
print(cat)// 輸出 ""

整數(shù)

整數(shù)就是沒有小數(shù)部分的數(shù)字佛猛,比如 42-23 惑芭。整數(shù)可以是 有符號(hào)(正數(shù)、零和負(fù)數(shù))或者無(wú)符號(hào)(正數(shù)继找、零)遂跟。
Swift 提供了8,16,32和64位的有符號(hào)和無(wú)符號(hào)整數(shù)類型幻锁。這些整數(shù)類型和 C 語(yǔ)言的命名方式很像凯亮,比如8位無(wú)符號(hào)整數(shù)類型是UInt8,32位有符號(hào)整數(shù)類型是Int32哄尔。就像 Swift 的其他類型一樣假消,整數(shù)類型采用大寫命名法。

整數(shù)范圍

你可以訪問不同整數(shù)類型的 minmax 屬性來(lái)獲取對(duì)應(yīng)類型的最小值和最大值:

 let minValue = UInt8.min  // minValue 為 0岭接,是 UInt8 類型
let maxValue = UInt8.max  // maxValue 為 255富拗,是 UInt8 類型

這些屬性的值具有適當(dāng)大小的數(shù)字類型(例如上例中的UInt8),因此可以與表達(dá)式一起使用同一類型的其他值鸣戴。

Int

大多數(shù)情況下啃沪,你不需要專門指定整數(shù)的長(zhǎng)度。Swift 提供了一個(gè)特殊的整數(shù)類型Int葵擎,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同:

  • 在32位平臺(tái)上谅阿,IntInt32長(zhǎng)度相同。
  • 在64位平臺(tái)上酬滤,IntInt64長(zhǎng)度相同。

除非你需要特定長(zhǎng)度的整數(shù)寓涨,一般來(lái)說(shuō)使用 Int就夠了盯串。這可以提高代碼一致性和可復(fù)用性。即使是在32位平臺(tái)上戒良,Int 可以存儲(chǔ)的整數(shù)范圍也可以達(dá)到 -2,147,483,648 ~ 2,147,483,647体捏,大多數(shù)時(shí)候這已經(jīng)足夠大了。

UInt

Swift 也提供了一個(gè)特殊的無(wú)符號(hào)類型 UInt糯崎,長(zhǎng)度與當(dāng)前平臺(tái)的原生字長(zhǎng)相同:

  • 在32位平臺(tái)上几缭,UInt 和 UInt32長(zhǎng)度相同。
  • 在64位平臺(tái)上沃呢,UInt 和 UInt64長(zhǎng)度相同年栓。

Note:盡量不要使用UInt,除非你真的需要存儲(chǔ)一個(gè)和當(dāng)前平臺(tái)原生字長(zhǎng)相同的無(wú)符號(hào)整數(shù)薄霜。除了這種情況某抓,最好使用Int,即使你要存儲(chǔ)的值已知是非負(fù)的惰瓜。統(tǒng)一使用Int可以提高代碼的可復(fù)用性否副,避免不同類型數(shù)字之間的轉(zhuǎn)換,并且匹配數(shù)字的類型推斷崎坊,請(qǐng)參考類型安全和類型推斷备禀。

浮點(diǎn)數(shù)

浮點(diǎn)數(shù)是有小數(shù)部分的數(shù)字,比如 3.14159,0.1 和 -273.15曲尸。
浮點(diǎn)類型比整數(shù)類型表示的范圍更廣呻待,可以存儲(chǔ)比Int
類型更大或者更小的數(shù)字。Swift 提供了兩種有符號(hào)浮點(diǎn)數(shù)類型:

  • Double表示64位浮點(diǎn)數(shù)队腐。
  • Float表示32位浮點(diǎn)數(shù)蚕捉。

Note:Double精確度很高,至少有15位數(shù)字柴淘,而Float只有6位數(shù)字迫淹。選擇哪個(gè)類型取決于你的代碼需要處理的值的范圍,在兩種類型都可以選擇的情況下为严,將優(yōu)先選擇 Double敛熬。

類型安全和類型推斷

Swift 是一個(gè)類型安全(type-safe)的語(yǔ)言。類型安全的語(yǔ)言可以讓你清楚地知道代碼要處理的值的類型第股。如果你的代碼需要一個(gè)String应民,你絕對(duì)不可能錯(cuò)誤地傳進(jìn)去一個(gè)Int。

由于 Swift 是類型安全的夕吻,所以它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(type checks)诲锹,并把不匹配的類型標(biāo)記為錯(cuò)誤。這可以讓你在開發(fā)的時(shí)候盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤涉馅。

當(dāng)你要處理不同類型的值時(shí)归园,類型檢查可以幫你避免錯(cuò)誤。然而稚矿,這并不是說(shuō)你每次聲明常量和變量的時(shí)候都需要顯式指定類型庸诱。如果你沒有顯式指定類型,Swift 會(huì)使用類型推斷(type inference)來(lái)選擇合適的類型晤揣。有了類型推斷桥爽,編譯器可以在編譯代碼的時(shí)候自動(dòng)推斷出表達(dá)式的類型。原理很簡(jiǎn)單昧识,只要檢查你賦的值即可钠四。

因?yàn)橛辛祟愋屯茢啵?C 或者 Objective-C 比起來(lái) Swift 很少需要聲明類型滞诺。常量和變量雖然需要明確類型形导,但是大部分工作并不需要你自己來(lái)完成。

當(dāng)你聲明常量或者變量并賦初值的時(shí)候類型推斷非常有用习霹。當(dāng)你在聲明常量或者變量的時(shí)候賦給它們一個(gè)確定值(literal value 或 literal)即可觸發(fā)類型推斷朵耕。(字面量就是會(huì)直接出現(xiàn)在你代碼中的值,比如 423.14159淋叶。)
例如阎曹,如果你給一個(gè)新常量賦值42并且沒有標(biāo)明類型,Swift 可以推斷出常量類型是 Int,因?yàn)槟憬o它賦的初始值看起來(lái)像一個(gè)整數(shù):

let meaningOfLife = 42// meaningOfLife 會(huì)被推測(cè)為 Int 類型

同理处嫌,如果你沒有給浮點(diǎn)數(shù)標(biāo)明類型栅贴,Swift 會(huì)推斷你想要的是Double

let pi = 3.14159// pi 會(huì)被推測(cè)為 Double 類型

當(dāng)推斷浮點(diǎn)數(shù)的類型時(shí),Swift 總是會(huì)優(yōu)先選擇 Double而不是Float熏迹。如果表達(dá)式中同時(shí)出現(xiàn)了整數(shù)和浮點(diǎn)數(shù)檐薯,會(huì)被推斷為 Double
類型:

let anotherPi = 3 + 0.14159  // anotherPi 會(huì)被推測(cè)為 Double 類型

原始值3 沒有顯式聲明類型,而表達(dá)式中出現(xiàn)了一個(gè)浮點(diǎn)數(shù)注暗,所以表達(dá)式會(huì)被推斷為 Double類型坛缕。

數(shù)值型字面量

整數(shù)字面量可以被寫作:

  • 一個(gè)十進(jìn)制數(shù),沒有前綴
  • 一個(gè)二進(jìn)制數(shù)捆昏,前綴是0b
  • 一個(gè)八進(jìn)制數(shù)赚楚,前綴是0o
  • 一個(gè)十六進(jìn)制數(shù),前綴是0x

下面的所有整數(shù)字面量的十進(jìn)制值都是17

let decimalInteger = 17
let binaryInteger = 0b10001   // 二進(jìn)制的17
let octalInteger = 0o21   // 八進(jìn)制的17
let hexadecimalInteger = 0x11   // 十六進(jìn)制的17

浮點(diǎn)字面量可以是十進(jìn)制(沒有前綴)或者是十六進(jìn)制(前綴是 0x )骗卜。小數(shù)點(diǎn)兩邊必須有至少一個(gè)十進(jìn)制數(shù)字(或者是十六進(jìn)制的數(shù)字)宠页。十進(jìn)制浮點(diǎn)數(shù)也可以有一個(gè)可選的指數(shù)(exponent),通過大寫或者小寫的 e來(lái)指定寇仓;十六進(jìn)制浮點(diǎn)數(shù)必須有一個(gè)指數(shù)举户,通過大寫或者小寫的 p來(lái)指定。如果一個(gè)十進(jìn)制數(shù)的指數(shù)為 exp焚刺,那這個(gè)數(shù)相當(dāng)于基數(shù)和10^exp的乘積:

1.25e2 表示 1.25 × 10^2敛摘,等于 125.0。
1.25e-2 表示 1.25 × 10^-2乳愉,等于 0.0125。

如果一個(gè)十六進(jìn)制數(shù)的指數(shù)為exp屯远,那這個(gè)數(shù)相當(dāng)于基數(shù)和2^exp的乘積:

0xFp2 表示 15 × 2^2蔓姚,等于 60.0。
0xFp-2 表示 15 × 2^-2慨丐,等于 3.75坡脐。

下面的這些浮點(diǎn)字面量都等于十進(jìn)制的12.1875:

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

數(shù)值類字面量可以包括額外的格式來(lái)增強(qiáng)可讀性。整數(shù)和浮點(diǎn)數(shù)都可以添加額外的零并且包含下劃線房揭,并不會(huì)影響字面量:

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

數(shù)值型類型轉(zhuǎn)換

通常來(lái)講备闲,即使代碼中的整數(shù)常量和變量已知非負(fù),也請(qǐng)使用Int類型捅暴√裆埃總是使用默認(rèn)的整數(shù)類型可以保證你的整數(shù)常量和變量可以直接被復(fù)用并且可以匹配整數(shù)類字面量的類型推斷。

只有在必要的時(shí)候才使用其他整數(shù)類型蓬痒,比如要處理外部的長(zhǎng)度明確的數(shù)據(jù)或者為了優(yōu)化性能杨刨、內(nèi)存占用等等圃阳。使用顯式指定長(zhǎng)度的類型可以及時(shí)發(fā)現(xiàn)值溢出并且可以暗示正在處理特殊數(shù)據(jù)扔字。

整數(shù)轉(zhuǎn)換

不同整數(shù)類型的變量和常量可以存儲(chǔ)不同范圍的數(shù)字劫狠。Int8類型的常量或者變量可以存儲(chǔ)的數(shù)字范圍是-128~127,而UInt8類型的常量或者變量能存儲(chǔ)的數(shù)字范圍是0~255耳标。如果數(shù)字超出了常量或者變量可存儲(chǔ)的范圍,編譯的時(shí)候會(huì)報(bào)錯(cuò):

let cannotBeNegative: UInt8 = -1// UInt8 類型不能存儲(chǔ)負(fù)數(shù),所以會(huì)報(bào)錯(cuò)
let tooBig: Int8 = Int8.max + 1// Int8 類型不能存儲(chǔ)超過最大值的數(shù)鸟顺,所以會(huì)報(bào)錯(cuò)

由于每種整數(shù)類型都可以存儲(chǔ)不同范圍的值,所以你必須根據(jù)不同情況選擇性使用數(shù)值型類型轉(zhuǎn)換器虾。這種選擇性使用的方式讯嫂,可以預(yù)防隱式轉(zhuǎn)換的錯(cuò)誤并讓你的代碼中的類型轉(zhuǎn)換意圖變得清晰。

為了將一種數(shù)字類型轉(zhuǎn)換成另一種曾撤,你要用當(dāng)前值來(lái)初始化一個(gè)期望類型的新數(shù)字端姚,這個(gè)數(shù)字的類型就是你的目標(biāo)類型。在下面的例子中挤悉,常量twoThousand是UInt16類型渐裸,然而常量one是UInt8類型。它們不能直接相加装悲,因?yàn)樗鼈冾愋筒煌杈椤K砸{(diào)用UInt16(one)來(lái)創(chuàng)建一個(gè)新的UInt16數(shù)字并用one的值來(lái)初始化,然后使用這個(gè)新數(shù)字來(lái)計(jì)算:

  let twoThousand: UInt16 = 2_000
  let one: UInt8 = 1
  let twoThousandAndOne = twoThousand + UInt16(one)

現(xiàn)在兩個(gè)數(shù)字的類型都是 UInt16诀诊,可以進(jìn)行相加洞渤。輸出常量 twoThousandAndOne 的類型被推斷為 UInt16,因?yàn)樗莾蓚€(gè) UInt16值的和属瓣。

SomeType(ofInitialValue)是調(diào)用Swift類型的初始化器并傳入初始值的默認(rèn)方式载迄。
在語(yǔ)言內(nèi)部,UInt16有接受一個(gè)UInt8的值抡蛙,這個(gè)初始化器用來(lái)從現(xiàn)有的UInt8中創(chuàng)建一個(gè)新的UInt16护昧。然而,你并不能傳入任意類型的值粗截,只能傳入UInt16類型的值惋耙。不過你可以擴(kuò)展現(xiàn)有的類型來(lái)讓它可以接收其他類型的值(包括自定義類型),請(qǐng)參考擴(kuò)展熊昌。

整數(shù)和浮點(diǎn)數(shù)轉(zhuǎn)換

整數(shù)和浮點(diǎn)數(shù)的轉(zhuǎn)換必須顯式指定類型:

let three = 3let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine  // pi 等于 3.14159绽榛,所以被推測(cè)為 Double 類型

這個(gè)例子中,常量 three的值被用來(lái)創(chuàng)建一個(gè)Double類型的值婿屹,所以加號(hào)兩邊的數(shù)類型須相同灭美。如果不進(jìn)行轉(zhuǎn)換,兩者無(wú)法相加选泻。浮點(diǎn)數(shù)到整數(shù)的反向轉(zhuǎn)換同樣行冲粤,整數(shù)類型可以用`` Double或者 Float`類型來(lái)初始化:

let integerPi = Int(pi)// integerPi 等于 3美莫,所以被推測(cè)為 Int 類型

當(dāng)用浮點(diǎn)類型來(lái)初始化一個(gè)新的整數(shù)值時(shí),浮點(diǎn)值會(huì)被截?cái)嗵莶丁R簿褪钦f(shuō) 4.75會(huì)變成 4厢呵,-3.9會(huì)變成 -3

Note:結(jié)合數(shù)字類常量和變量不同于結(jié)合數(shù)字類字面量傀顾。字面量3可以直接和字面量0.14159相加襟铭,因?yàn)閿?shù)字字面量本身沒有明確的類型。它們的類型只在編譯器需要求值的時(shí)候被推測(cè)短曾。

類型別名

類型別名type aliases就是給現(xiàn)有類型定義另一個(gè)名字寒砖。你可以使用typealias關(guān)鍵字來(lái)定義類型別名。

當(dāng)你想要給現(xiàn)有類型起一個(gè)更合適的名字時(shí)嫉拐,類型別名非常有用哩都。比如你正在處理特定長(zhǎng)度的外部資源的數(shù)據(jù):

typealias AudioSample = UInt16

定義了一個(gè)類型別名之后,你可以在任何使用原始名的地方使用別名:

var maxAmplitudeFound = AudioSample.min// maxAmplitudeFound 現(xiàn)在是 0

本例中婉徘,AudioSample被定義為UInt16的一個(gè)別名漠嵌。因?yàn)樗莿e名,AudioSample.min實(shí)際上是UInt16.min盖呼,所以會(huì)給maxAmplitudeFound賦一個(gè)初值0儒鹿。

布爾值

Swift 有一個(gè)基本的布爾Boolean類型,叫做Bool几晤。布爾值指邏輯上的值约炎,因?yàn)樗鼈冎荒苁钦婊蛘呒佟wift 有兩個(gè)布爾常量蟹瘾,truefalse

let orangesAreOrange = truelet 
turnipsAreDelicious = false

orangesAreOrangeturnipsAreDelicious 的類型會(huì)被推斷為 Bool圾浅,因?yàn)樗鼈兊某踔凳遣紶栕置媪俊>拖裰疤岬降?IntDouble一樣憾朴,如果創(chuàng)建變量的時(shí)候給它們賦值 true或者false贱傀,那你不需要將常量或者變量聲明為Bool類型。初始化常量或者變量的時(shí)候如果所賦的值類型已知伊脓,就可以觸發(fā)類型推斷,這讓 Swift 代碼更加簡(jiǎn)潔并且可讀性更高魁衙。當(dāng)你編寫條件語(yǔ)句比如 if 語(yǔ)句的時(shí)候报腔,布爾值非常有用:

if turnipsAreDelicious {
     print("Mmm, tasty turnips!")
} else { 
     print("Eww, turnips are horrible.")
}
// 輸出 "Eww, turnips are horrible."

條件語(yǔ)句,例如if剖淀,請(qǐng)參考控制流纯蛾。

如果你在需要使用 Bool類型的地方使用了非布爾值,Swift 的類型安全機(jī)制會(huì)報(bào)錯(cuò)纵隔。下面的例子會(huì)報(bào)告一個(gè)編譯時(shí)錯(cuò)誤:

let i = 1if i { // 這個(gè)例子不會(huì)通過編譯翻诉,會(huì)報(bào)錯(cuò)}

然而炮姨,下面的例子是合法的:

let i = 1
if i == 1 { 
    // 這個(gè)例子會(huì)編譯成功
}

i == 1 的比較結(jié)果是 Bool類型,所以第二個(gè)例子可以通過類型檢查碰煌。類似i ==1這樣的比較舒岸,請(qǐng)參考基本操作符。和 Swift 中的其他類型安全的例子一樣芦圾,這個(gè)方法可以避免錯(cuò)誤蛾派,并確保特定代碼的意圖總是清晰的。

元組

元組tuples把多個(gè)值組合成一個(gè)復(fù)合值个少。元組內(nèi)的值可以是任意類型洪乍,并不要求是相同類型。

下面這個(gè)例子中夜焦,(404, "Not Found")是一個(gè)描述 HTTP 狀態(tài)碼HTTP status code的元組壳澳。HTTP 狀態(tài)碼是當(dāng)你請(qǐng)求網(wǎng)頁(yè)的時(shí)候 web 服務(wù)器返回的一個(gè)特定值。如果你請(qǐng)求的網(wǎng)頁(yè)不存在就會(huì)返回一個(gè) 404 Not Found 狀態(tài)碼茫经。

let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String)巷波,值是 (404, "Not Found")

404, "Not Found"元組把一個(gè) Int 值和一個(gè)String值組合起來(lái)表示HTTP狀態(tài)碼的兩個(gè)部分:一個(gè)數(shù)字和一個(gè)人類可讀的描述。這個(gè)元組被定義為“一個(gè)類型為 (Int, String)的元組”科平。
你可以把任意順序的類型組合成一個(gè)元組褥紫,這個(gè)元組可以包含所有類型。你可以創(chuàng)建任何一個(gè)類型為(Int, Int, Int)或者 (String, Bool) 或者其他任何你想要的組合的元組瞪慧。你可以將一個(gè)元組內(nèi)容分解(decompose)成單獨(dú)的常量和變量髓考,然后你就可以正常使用它們了:

let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 輸出 "The status code is 404"
print("The status message is \(statusMessage)")
// 輸出 "The status message is Not Found"

如果你只需要一部分元組值,分解的時(shí)候可以把要忽略的部分用下劃線(_ )表示:

let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 輸出 "The status code is 404"

此外弃酌,你還可以通過下標(biāo)來(lái)訪問元組中的單個(gè)元素氨菇,下標(biāo)從零開始:

print("The status code is \(http404Error.0)")
// 輸出 "The status code is 404"
print("The status message is \(http404Error.1)")
// 輸出 "The status message is Not Found"

你可以在定義元組的時(shí)候給單個(gè)元素命名:

let http200Status = (statusCode: 200, description: "OK")

給元組中的元素命名后,你可以通過名字來(lái)獲取這些元素的值:

print("The status code is \(http200Status.statusCode)")
// 輸出 "The status code is 200"
print("The status message is \(http200Status.description)")
// 輸出 "The status message is OK"

作為函數(shù)返回值時(shí)妓湘,元組非常有用查蓉。一個(gè)用來(lái)獲取網(wǎng)頁(yè)的函數(shù)可能會(huì)返回一個(gè)(Int, String) 元組來(lái)描述是否獲取成功。和只能返回一個(gè)類型的值比較起來(lái)榜贴,一個(gè)包含兩個(gè)不同類型值的元組可以讓函數(shù)的返回信息更有用豌研。請(qǐng)參考函數(shù)參數(shù)與返回值

Note:元組在臨時(shí)組織值的時(shí)候很有用唬党,但是并不適合創(chuàng)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu)鹃共。如果你的數(shù)據(jù)結(jié)構(gòu)并不是臨時(shí)使用,請(qǐng)使用類或者結(jié)構(gòu)體而不是元組驶拱。請(qǐng)參考類和結(jié)構(gòu)體霜浴。

The Basics 上半部分完結(jié), 下半部分我們將于明天下午發(fā)布.

Guards從開始翻譯Swift文檔到現(xiàn)在,每篇均是翻譯組成員利用周末或下班時(shí)間貢獻(xiàn)出來(lái)的蓝纲,每篇均進(jìn)行了多次的修改和校對(duì)阴孟。這期間晌纫,部分成員因?yàn)闊o(wú)法安排足夠的時(shí)間參與翻譯工作,已經(jīng)暫時(shí)退出了翻譯組永丝。如果你喜歡我們的文章锹漱, :-) 期待小額資金捐贈(zèng) :-),你們的支持是對(duì)我們持續(xù)翻譯的動(dòng)力类溢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凌蔬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闯冷,更是在濱河造成了極大的恐慌砂心,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛇耀,死亡現(xiàn)場(chǎng)離奇詭異辩诞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纺涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門译暂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人撩炊,你說(shuō)我怎么就攤上這事外永。” “怎么了拧咳?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵伯顶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我骆膝,道長(zhǎng)祭衩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任阅签,我火速辦了婚禮掐暮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘政钟。我一直安慰自己路克,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布养交。 她就那樣靜靜地躺著衷戈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层坠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天刁笙,我揣著相機(jī)與錄音破花,去河邊找鬼谦趣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛座每,可吹牛的內(nèi)容都是我干的前鹅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼峭梳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舰绘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起葱椭,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捂寿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后孵运,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秦陋,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年治笨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驳概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旷赖,死狀恐怖顺又,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情等孵,我是刑警寧澤稚照,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站流济,受9級(jí)特大地震影響锐锣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绳瘟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一雕憔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糖声,春花似錦斤彼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悦施,卻和暖如春并扇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抡诞。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工穷蛹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留土陪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓肴熏,卻偏偏與公主長(zhǎng)得像鬼雀,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蛙吏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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