1. 簡(jiǎn)單值
使用 let
來聲明常量,使用 var
來聲明變量,代碼示例:
var myVariable = 42
myVariable = 50
let myConstant = 42
PS: 常量或變量的類型必須和你賦給它們的值一樣。然而,你不用明確地聲明類型,聲明的同時(shí)賦值的話,編譯器會(huì)自動(dòng)推斷類型。
如果初始值沒有提供足夠的信息(或者沒有初始值),那你需要在變量后面聲明類型,用冒號(hào)分割。例如:
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
let decimalInt:Int = 9 //十進(jìn)制
let binaryInt:Int = 0b1001 //二進(jìn)制
let d:Double = 0.1415926
- 顯式&隱式轉(zhuǎn)換
值永遠(yuǎn)不會(huì)隱式轉(zhuǎn)換為其他類型。若需要把一個(gè)值轉(zhuǎn)換為其他類型,請(qǐng)顯式轉(zhuǎn)換。例如:
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
let widthLabel = label + " \(width)" //這樣可以添加一個(gè)空格
有一種更簡(jiǎn)單的把值轉(zhuǎn)換成字符串的方法:把值寫到括號(hào)中,并且在括號(hào)之前寫一個(gè)反斜杠。例如:
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
- 使用方括號(hào)
[]
來創(chuàng)建數(shù)組和字典,并使用下標(biāo)或者鍵(key)來訪問元素(最后一個(gè)元素后面允許有個(gè)逗號(hào))。例如:
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
要?jiǎng)?chuàng)建一個(gè)空數(shù)組或者字典,使用初始化語(yǔ)法:
let emptyArray = [String]()
let emptyDictionary = [String: Float]()
如果類型信息可以被推斷出來,你可以用 []
和 [:]
來創(chuàng)建空數(shù)組和空字典——就像你聲明變量或者給函數(shù)傳參數(shù)的時(shí)候一樣。
shoppingList = []
occupations = [:]
- 元組 Tuples
元組:將多個(gè)不同的值集合成一個(gè)數(shù)據(jù)。
特點(diǎn):可以有多個(gè)值;不同的值可以是不同類型。
示例代碼:
let connection = ( 404, "Not Found" )
// 訪問方式一
connection.0
connection.1
// 訪問方式二
let ( code, alert ) = connection
code //這樣可以富含語(yǔ)義
alert
// 若不關(guān)心第二個(gè)變量,則可以用下劃線替代,如下:
let ( code, _ ) = connection
code
2. 控制流
使用 if
和 switch
來進(jìn)行條件操作,使用 for-in
、 for
、 while
和 repeat-while
來進(jìn)行循環(huán)(包裹條件和循環(huán)變量括號(hào)可以省略,但是語(yǔ)句體的大括號(hào)是必須的)。例如:
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)
PS: 在 if
語(yǔ)句中,條件必須是一個(gè)布爾表達(dá)式——這意味著像 if score { ... }
這樣的代碼將報(bào)錯(cuò),而不會(huì)隱形地 與 0 做對(duì)比。
- Optional 可選值
你可以一起使用if
和let
來處理值缺失的情況。這些值可由可選值來代表。一個(gè)可選值是一個(gè)具體的值或者是nil
以表示值缺失。在類型后面加一個(gè)問號(hào)來標(biāo)記這個(gè)變量的值是可選的。例如:
var optionalString: String? = "Hello" //此處也可以不賦值,則默認(rèn)為 nil
print(optionalString == nil)
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
//此時(shí)輸出為 "Hello, John Appleseed", 若 optionalName 不賦值,則 if 語(yǔ)句不執(zhí)行
關(guān)于可選值,可參考視頻 可選型 Optionals
另一種處理可選值的方法是通過使用 ??
操作符來提供一個(gè)默認(rèn)值。若可選值缺失,則使用默認(rèn)值來代替。例如:
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
// 若 nickName 為 nil,則用 fullName 替代;否則為 nickName
- switch
switch
支持任意類型的數(shù)據(jù)以及各種比較操作(不僅僅是整數(shù)以及測(cè)試相等)。例如:
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
PS: 運(yùn)行
switch
中匹配到的子句之后,程序會(huì)退出switch
語(yǔ)句,并不會(huì)繼續(xù)向下運(yùn)行,所以不需要在每個(gè)子句結(jié)尾 寫break
。
- for-in
你可以使用for-in
來遍歷字典,需要兩個(gè)變量來表示每個(gè)鍵值對(duì)。字典是一個(gè)無序的集合,所以他們的鍵和值以任意順序迭代結(jié)束。例如:
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
- while
使用while
來重復(fù)運(yùn)行一段代碼直到不滿足條件。循環(huán)條件也可以在結(jié)尾,保證能至少循環(huán)一次。例如:
var n = 2
while n < 100 {
n = n * 2
}
print(n)
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)
可以在循環(huán)中使用 ..<
來表示范圍,也可以使用傳統(tǒng)的寫法,兩者是等價(jià)的。如下:
var firstForLoop = 0
for i in 0..<4 {
firstForLoop += i
}
print(firstForLoop)
var secondForLoop = 0
for var i = 0; i < 4; ++i {
secondForLoop += i
}
print(secondForLoop)
PS: 使用
..<
創(chuàng)建的范圍不包含上界,如果想包含的話需要使用...
。