- 模式代表單個(gè)值或者復(fù)合值的結(jié)構(gòu)
- 模式代表一種值的結(jié)構(gòu),而不是特定的某個(gè)值,你可以利用模式來匹配各種各樣的值。處理利用模式匹配一個(gè)值以外,你可以從復(fù)合值中提取出一部分或全部值,然后分別吧各個(gè)部分的值和一個(gè)常量或變量綁定起來
- Swift 中的模式分為兩類,一種能成功匹配任何類型的值,另一種在運(yùn)行時(shí)匹配某個(gè)特定值時(shí)可能會失敗
- 第一種模式用于解構(gòu)簡單變量、常量和可選綁定中的值,此類模式包括通配符模式、標(biāo)識符模式, 以及包含前兩種模式的值綁定模式和元組模式,你可以為此類模式指定一個(gè)類型標(biāo)注,從而限制他們只能匹配某種特定類型的值
- 第二種模式用于全模式匹配,這種情況下你試圖匹配的值,在運(yùn)行時(shí)可能不存在,此類模式包括枚舉用例模式、可選模式、表達(dá)式模式和類型轉(zhuǎn)換模式。你在 switch 語句的 case 標(biāo)簽中,do 語句的 catch 子句中,或者 if、while、guard和for-in 語句的case條件語句中使用這種模式
- 通配符模式 (Wildcard Pattern) 通配符模式由一個(gè)下劃線(_)構(gòu)成,用于匹配并忽略任何值,當(dāng)你想忽略被匹配的值時(shí),可以使用該模式
for _ in 1...3 {
}
- 標(biāo)識符模式 (Identifier Pattern) 標(biāo)識符模式匹配任意值,并將匹配的值和一個(gè)變量或者常量綁定起來
let someValue = 42
- 值綁定模式 (Value-Binding Pattern) 值綁定模式把匹配到的值綁定給一個(gè)常量或變量。把匹配到的值綁定給常量時(shí),用關(guān)鍵字let,綁定給變量時(shí),用關(guān)鍵字var
let point = (3, 2)
switch point {
//將point 中的元素綁定到 x 和 y
case let (x, y):
print("The point is at (\(x), \(y))")
}
- 元組模式 (Tuple Pattern)
- - 元組模式是由逗號分隔,具有另個(gè)或多個(gè)模式的列表,并由一堆圓括號括起來,元組模式匹配相應(yīng)元組類型的值
- - 你可以使用類型標(biāo)注,去限制一個(gè)元組模式能匹配哪種元組類型
- - 當(dāng)元組模式被用于 for-in 語句或者變量和常量聲明中,它僅可以包括通配符模式、標(biāo)識符模式、可選模式或者其他包含這些模式的元組模式
let points = [(3, 0), (1, 0), (0, 0), (9, 1)]
for (x, y) in points where y == 0 {
print("\(x) and \(y)")
}
- 枚舉用例模式 (Enumeration Case Pattern) 枚舉用例模式匹配現(xiàn)有的每個(gè)枚舉類型的某個(gè)用例,枚舉用例模式出現(xiàn)在 switch 語句中的 case 標(biāo)簽中,以及 if、while、guard 和 for-in 語句的 case 條件中
- 可選模式 (Optional Pattern)
- 可選項(xiàng)模式匹配 Optional枚舉在 some(Wrapped) 中包裝的值
- 可選項(xiàng)目模式為 for-in 語句提供了一種迭代數(shù)組的簡便方式,職位數(shù)組中非 nil 的元素執(zhí)行循環(huán)體
let someOptional: Int? = 42
//使用枚舉事例模式匹配
if case .some(let x) = someOptional {
print(x)
}
//使用可選模式匹配
if case let x? = someOptional {
print(x)
}
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
//僅匹配非 nil 值。
for case let number? in arrayOfOptionalInts {
print("Found a \(number)")
}
- 類型轉(zhuǎn)換模式 (Type-Casting Pattern) 類型轉(zhuǎn)換模式由兩種:is 模式和 as 模式,is模式只出現(xiàn)在 switch 語句中的 case 標(biāo)簽中
- is 模式僅當(dāng)一個(gè)值的類型在運(yùn)行時(shí)和 is 模式右邊的指定類型一致,或者是其子類的情況下,才會匹配到這個(gè)值。is 模式和 is 運(yùn)算符有相似表現(xiàn),他們都進(jìn)行類型轉(zhuǎn)換,但是 is 模式?jīng)]有返回值。
- as 模式僅當(dāng)一個(gè)值的類型在運(yùn)行時(shí)和 as 模式右邊的指定類型一致,或者是其子類的情況下,才會匹配這個(gè)值, 如果匹配成功,被匹配的值的類型被轉(zhuǎn)換成 as 模式右邊指定的類型
protocol Animal {
var name: String { get }
}
struct Dog: Animal {
var name: String {
return "dog"
}
var runSpeed: Int
}
struct Bird: Animal {
var name: String {
return "bird"
}
var flightHeight: Int
}
struct Fish: Animal {
var name: String {
return "fish"
}
var depth: Int
}
let animals: [Any] = [Dog(runSpeed: 55), Bird(flightHeight: 2000), Fish(depth: 100)]
for animal in animals {
switch animal {
case let dog as Dog:
print("\(dog.name) can run \(dog.runSpeed)")
case let fish as Fish:
print("\(fish.name) can dive depth \(fish.depth)")
case is Bird:
print("bird can fly")
default:
print("unknown animal!")
}
}
- 表達(dá)式模式 (Expression Pattern)
- 表達(dá)式模式代表表達(dá)式的值,表達(dá)式模式只出現(xiàn)在 switch 語句中的 case 標(biāo)簽中。
- 表達(dá)式模式代表的表達(dá)式會使用 swift 標(biāo)準(zhǔn)庫中的 ~= 運(yùn)算符,與束縛表達(dá)式的值進(jìn)行比較,如果 ~= 運(yùn)算符返回 true ,則匹配成功,模式情況下, ~= 運(yùn)算符使用 == 運(yùn)算符來比較兩個(gè)相同類型的值,她也可以將一個(gè)整形數(shù)值與一個(gè) Range 實(shí)例中的一段整數(shù)區(qū)間做匹配
let point = (1, 2)
switch point {
case (0, 0):
print("(0, 0) is at the origin.")
case (-2...2, -2...2):
print("(\(point.0), \(point.1)) is near the origin")
default:
print("The point is at (\(point.0), \(point.1))")
}
- 可以重載 ~= 運(yùn)算符來提供自定義的表達(dá)式匹配行為
func ~= (pattern: String, value: Int) -> Bool {
return pattern == "\(value)"
}
let point = (1, 2)
switch point {
case ("0", "0"):
print("(0, 0) is at the origin.")
default:
print("The point is at (\(point.0), \(point.1))")
}
- 自定義類型默認(rèn)也是無法進(jìn)行表達(dá)式模式匹配的,也需要重載 ~= 運(yùn)算符
struct Emplyee {
var salary: Float
}
let e = Emplyee(salary: 9999)
func ~= (lhs: Range<Float>, rhs: Emplyee) -> Bool {
return lhs.contains(rhs.salary)
}
switch e {
case 0.0..<1000:
print("艱難生存")
case 1000..<10000:
print("小康生活")
case 10000..<100000:
print("很滋潤的活著")
default:
break
}