Swift 模式和模式匹配

  • 模式
  1. 模式代表單個(gè)值或者復(fù)合值的結(jié)構(gòu)
  2. 模式代表一種值的結(jié)構(gòu),而不是特定的某個(gè)值,你可以利用模式來匹配各種各樣的值。處理利用模式匹配一個(gè)值以外,你可以從復(fù)合值中提取出一部分或全部值,然后分別吧各個(gè)部分的值和一個(gè)常量或變量綁定起來
  • 模式分類
  1. Swift 中的模式分為兩類,一種能成功匹配任何類型的值,另一種在運(yùn)行時(shí)匹配某個(gè)特定值時(shí)可能會失敗
  2. 第一種模式用于解構(gòu)簡單變量、常量和可選綁定中的值,此類模式包括通配符模式、標(biāo)識符模式, 以及包含前兩種模式的值綁定模式和元組模式,你可以為此類模式指定一個(gè)類型標(biāo)注,從而限制他們只能匹配某種特定類型的值
  3. 第二種模式用于全模式匹配,這種情況下你試圖匹配的值,在運(yùn)行時(shí)可能不存在,此類模式包括枚舉用例模式、可選模式、表達(dá)式模式和類型轉(zhuǎn)換模式。你在 switch 語句的 case 標(biāo)簽中,do 語句的 catch 子句中,或者 if、while、guard和for-in 語句的case條件語句中使用這種模式
  • 模式分類
  1. 通配符模式 (Wildcard Pattern) 通配符模式由一個(gè)下劃線(_)構(gòu)成,用于匹配并忽略任何值,當(dāng)你想忽略被匹配的值時(shí),可以使用該模式
for _ in 1...3 {
    
}
  1. 標(biāo)識符模式 (Identifier Pattern) 標(biāo)識符模式匹配任意值,并將匹配的值和一個(gè)變量或者常量綁定起來
let someValue = 42
  1. 值綁定模式 (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))")
}
  1. 元組模式 (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)")
}
  1. 枚舉用例模式 (Enumeration Case Pattern) 枚舉用例模式匹配現(xiàn)有的每個(gè)枚舉類型的某個(gè)用例,枚舉用例模式出現(xiàn)在 switch 語句中的 case 標(biāo)簽中,以及 if、while、guard 和 for-in 語句的 case 條件中
  2. 可選模式 (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)")
}
  1. 類型轉(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!")
    }
}
  1. 表達(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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容