1. 常量和變量
let
聲明常量, var
聲明變量。
let maximumNumberOfLoginAttempts = 10
var currentLoginAttempt = 0
多個常量或者變量聲明用逗號分隔:
var x = 0.0, y = 0.0, z = 0.0
2. 類型標注
冒號加空格 + 類型名
var welcomeMessage: String
多個常量或者變量聲明用逗號分隔:
var red, green, blue: Double
3. 命名常量和變量
命名規(guī)范:常量和變量的名字不能包含空白字符、數(shù)學符號、箭頭纹因、保留的(或者無效的)Unicode 碼位、連線和制表符鲫竞。也不能以數(shù)字開頭辐怕,盡管數(shù)字幾乎可以使用在名字其他的任何地方。
let π = 3.14159
let 你好 = "你好世界"
let ???? = "dogcow"
4. 輸出常量和變量
print(常量或變量名)
print("The current value of friendlyWelcome
is \(常量或變量名)")
5. 注釋
1. // 這是一個注釋
2. /* 這也是
一個
注釋 */
3. /* 這是第一個多行注釋的開頭
/* 這是第二個嵌套在內(nèi)的注釋塊 */
這是第一個注釋塊的結(jié)尾*/
6. 分號
單行多個語句時用來分隔从绘,其它情況可省略寄疏。
let cat = "??"; print(cat)
7. 整數(shù)
分為有符號(正負數(shù)和0)和無符號(正數(shù)和0)整數(shù)
Swift提供了8,16僵井,32 和 64位編碼的有符號和無符號整數(shù)
- 有符號:
Int8
Int16
Int32
Int64
- 無符號:
UInt8
UInt16
UInt32
UInt64
整數(shù)范圍
通過 min
和 max
屬性來訪問每個整數(shù)類型的最小值和最大值:
let minValue = UInt8.min // 最小值是 0, 值的類型是 UInt8
let maxValue = UInt8.max // 最大值是 255, 值得類型是 UInt8
Int
32 位機器上是Int32
, 64 位機器上是Int64
.
UInt
32 位機器上是UInt32
, 64 位機器上是UInt64
.
8. 浮點數(shù)
- Double代表 64 位的浮點數(shù)陕截。
- Float 代表 32 位的浮點數(shù)
Double
有至少 15 位數(shù)字的精度,而Float
的精度只有 6 位批什。
9. 類型安全和類型推斷
類型安全:編譯代碼的時候會進行類型檢查农曲,任何不匹配的類型都會被標記為錯誤。
類型推斷:未進行類型聲明驻债,自動推斷出合適的類型乳规。如:
let meaningOfLife = 42 // meaningOfLife 被推斷為 Int 類型
let pi = 3.14159 // pi 被推斷為 Double 類型
let anotherPi = 3 + 0.14159 // anotherPi 被推斷為 Double 類型
10. 數(shù)值型字面量
- 十進制數(shù),沒有前綴
- 二進制數(shù)合呐,前綴:
0b
- 八進制數(shù)暮的,前綴:
0o
- 十六進制數(shù),前綴:
0x
示例分別為:
let decimalInteger = 17
let binaryInteger = 0b10001 // 17 in binary notation
let octalInteger = 0o21 // 17 in octal notation
let hexadecimalInteger = 0x11 // 17 in hexadecimal notation
整數(shù)和浮點數(shù)都可以添加額外的零或者添加下劃線來增加代碼的可讀性:
let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1
11. 數(shù)值類型轉(zhuǎn)換
整數(shù)轉(zhuǎn)換
不同整數(shù)的類型在變量和常量中存儲的數(shù)字范圍是不同的淌实。Int8
類型的常量或變量可以存儲的數(shù)字范圍是 -128 ~ 127冻辩,而 UInt8
類型的常量或者變量能存儲的數(shù)字范圍是 0~255 。如果數(shù)字超出了常量或者變量可存儲的范圍拆祈,編譯的時候就會報錯:
let cannotBeNegative: UInt8 = -1
// UInt8 類型不能存負數(shù)恨闪,編譯會報錯。
let tooBig: Int8 = Int8.max + 1
// Int8 類型個不能存大于其最大值的數(shù)字放坏,所以編譯也會報錯
不同類型的整型原則上無法直接相加咙咽,需要轉(zhuǎn)換為同一類型,如:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne = twoThousand + UInt16(one)
整數(shù)和浮點數(shù)轉(zhuǎn)換
let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine
// pi 此時為 3.14159, 并未推斷為 Double 類型淤年。
let integerPi = Int(pi)
// integerPi 此時為 3, 并被推斷為 Int 類型钧敞。
注意:浮點數(shù)->整數(shù)類型時,數(shù)值會被截斷互亮。如: 4.75 會變成 4犁享,-3.9 會變?yōu)?-3。
12. 類型別名
給系統(tǒng)類型換個你覺得爽的名字:
typealias AudioSample = UInt16
// 此時 AudioSample 和 UInt16等價豹休,如用它初始化下面的變量 maxAmplitudeFound:
var maxAmplitudeFound = AudioSample.max
13. 布爾值(Bool)
Swift布爾值是兩個常量值炊昆,true
和 false
,聲明一個Bool值:
let orangesAreOrange = true
let turnipsAreDelicious = false
Bool常用語if語句,如:
if turnipsAreDelicious {
print("Mmm, tasty turnips!")
} else {
print("Eww, turnips are horrible.")
}
注意:非Bool值不可以作為if語句的判斷條件
14. 元組
圓括號組裝一堆類型凤巨,稱之為元組视乐。
元組內(nèi)的值可以是任何類型,而且可以不必是同一類型敢茁。如:
常量http404Error
是 (Int, String)
類型, 值是(404, "Not Found")
let http404Error = (404, "Not Found")
拆開這個元組:
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// 打印結(jié)果: "The status code is 404"
print("The status message is \(statusMessage)")
// 打印結(jié)果: "The status message is Not Found"
如想忽略某些信息佑淀,變量名可以用下劃線“_”代替:
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// 打印結(jié)果: "The status code is 404"
換個姿勢拆這個元組, 索引:
print("The status code is \(http404Error.0)")
// 打印結(jié)果: "The status code is 404"
print("The status message is \(http404Error.1)")
// 打印結(jié)果: "The status message is Not Found"
或者一開始你就取好元組內(nèi)的成員名字:
let http200Status = (statusCode: 200, description: "OK")
print("The status code is \(http200Status.statusCode)")
// 打印結(jié)果: "The status code is 200"
print("The status message is \(http200Status.description)")
// 打印結(jié)果: "The status message is OK"
15. 可選項
可選項,允許一個常量或變量值為nil
彰檬。
nil
聲明一個可選變量伸刃,并置nil。
var serverResponseCode: Int? = 404
// serverResponseCode 有值逢倍,是404捧颅。
serverResponseCode = nil
// serverResponseCode 此時為nil
如果定義的可選變量沒有提供默認值,變量會被自動設(shè)置成nil
较雕。
var surveyAnswer: String?
// surveyAnswer 被自動設(shè)置成 nil
注意:非可選變量或常量不可以置nil
If 語句以及強制展開
原理: 如果一個可選項有值碉哑,它就“不等于” nil
,所以if
語句派上用場:
if convertedNumber != nil {
print("convertedNumber contains some integer value.")
}
// 打印結(jié)果: "convertedNumber contains some integer value."
一旦你確定可選項中包含值亮蒋,可以在可選項名字后以一個感嘆號強制展開扣典,如:
if convertedNumber != nil {
print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 打印結(jié)果: "convertedNumber has an integer value of 123."
注意:強制展開
nil
會導致運行錯誤,因此要確保其有值慎玖。
可選項綁定
上面的例子通常用下面的綁定寫法代替:
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 打印結(jié)果: "'123' has an integer value of 123"
多個判斷條件用逗號分隔贮尖,下面兩個例子是等價的:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// 打印結(jié)果: "4 < 42 < 100"
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// 打印結(jié)果: "4 < 42 < 100"
注意:使用
if
語句創(chuàng)建的常量和變量只在if
語句的函數(shù)體內(nèi)有效。但是凄吏,在guard
語句中創(chuàng)建的常量和變量在guard
語句后的代碼中仍然可用远舅。
嘆號展開可選項
有時在一些程序結(jié)構(gòu)中變量一旦被設(shè)定值之后闰蛔,就會一直擁有值痕钢,因此不必每次訪問的時候都進行判斷然后展開。這種一定能被訪問到值的變量序六,定義時可以采用如(String!
)而非問號(String?
) 來初始化任连。如:
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 直接訪問assumedString,不需要嘆號
普通的可選項必須用“變量或常量名 + 嘆號”的方式或者可選項綁定的方式訪問:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // possibleString 后需要接一個嘆號
注意:若變量可能為nil例诀,則不建議使用嘆號展開可選項
16. 錯誤處理
使用錯誤處理機制來為錯誤狀況負責:
func canThrowAnError() throws {
// 函數(shù)名括號后添加“throws”關(guān)鍵字随抠,表明此函數(shù)或許會拋出異常。
}
異常有拋出繁涂,相應(yīng)地拱她,就有捕獲(使用do{}...catch{}
語句):
do {
try canThrowAnError()
// 使用“try”關(guān)鍵字 嘗試捕獲或許會拋出異常的函數(shù)
} catch {
// 捕獲異常后,做后續(xù)處理
}
舉個栗子:
func makeASandwich() throws {
// 此函數(shù)是指要做三明治扔罪,但有可能過程沒那么順利秉沼,拋出異常。
}
do {
try makeASandwich() // 嘗試做三明治
eatASandwich() // 做好了,沒異常唬复,直接吃掉矗积。
} catch Error.OutOfCleanDishes { // 異常情況: 盤子不干凈
washDishes() // 洗盤子
} catch Error.MissingIngredients(let ingredients) { // 異常情況: 缺少佐料
buyGroceries(ingredients) // 去買佐料
}
注意:若異常條件都滿足,則都執(zhí)行相應(yīng)后續(xù)處理敞咧。更詳細使用方式棘捣,后續(xù)介紹。
17.斷言
想提前終止程序進行調(diào)試時休建,使用斷言乍恐。
使用斷言進行調(diào)試
使用全局函數(shù) assert(_:_:)
函數(shù)來寫斷言:
let age = -3
assert(age >= 0, "A person's age cannot be less than zero")
// 此函數(shù)第一個參數(shù)為Bool,第二個參數(shù)(也可以省略)為String测砂。
// 如果Bool值為false禁熏,則程序終止,輸出第二個參數(shù)的String值邑彪。
// 因此瞧毙,如果年齡age為負數(shù),程序終止寄症,輸出后面字符串宙彪。
注意: Xcode以默認發(fā)布配置編譯到app時,斷言失效有巧。
什么時候常使用斷言
- 判定數(shù)組越界
- 判定合法值
- 判定可選項非空
斷言是作為調(diào)試的有效手段释漆。