swift模式和模式匹配

模式和模式匹配

模式:

表明單個或者複合值得結構,也就是說模式不是一個特定的值,它是一種抽象的結構,【一句話,不是特指,是泛指】。這樣就能夠用模式來匹配各類各樣的值。
例如:(x,y)能夠匹配元祖(1.2),以及任何包含兩個元素的元組。
除了利用模式匹配一個值之外,你能夠從複合值中提取出部分或所有值,而後把各個部分的值和一個常量或變量綁定起來。
swift中的模式分爲兩類:
一種能匹配任何類型的值,另外一種在運行時匹配某個特定的值,可能會失敗。
第一種模式用於結構簡單變量,常量和可選綁定中的值。此類模式包括通配符模式,標識符模式,以及包含前兩種模式的值綁定模式和元組模式。你能夠爲這類模式指定一個類型標註,從而限制它們只能匹配某種特定類型的值。
第二種模式用於全局模式匹配。這種狀況下,你試圖匹配的值在運行時可能不存在。此類模式包括枚舉用例模式,可選模式,表達式模式和類型轉換模式。你在switch語句的case標籤中,do語句的catch 子句中,或者再if,while,guard,for-in語句的case條件語句中使用這類模式。express

模式匹配

通配符模式 ( wildcard pattern)

通配符模式由一個下劃線(_)構成,用於匹配並忽略任何值,當你想忽略被匹配的值時可使用該模式。swift

for _ in 1...3{
    
}

標識符模式 (identifier pattern)

標識符模式能夠匹配任何值,並將匹配的一個變量或者常量綁定起來數組

let someValue = 42

值綁定模式 value-binding pattern

值綁定模式把匹配到的值綁定給一個變量或者常量,把匹配到的值給常量是,用關鍵字 let, 綁定給變量時 用關鍵字 varapp

let point = (3, 2)
switch point {
    //將point中的元素綁定到 x 和 y
case let (x, y):
    print("point is at x:(\(x), \(y)")
}

元組模式 (tupel pattern)

元組模式是由都好分隔的,具備零個或多個模式的列表,並由一對圓括號括起來。元組模式匹配到響應的元組類型值。
你可使用類型標註去限制一個元組模式只能匹配那種元組類型。例如, 在常量聲明 let(x ,y):(Int, Int) = (1,2)中的元組模式(x,y):(Int,Int)就只能匹配兩個元素都是Int類型的元組。ide

當元組模式被用於 for-in 語句或者變量和常量聲明時,它僅能夠包含通配符模式,標識符模式,可選模式或者其餘包含這下模式的元組模式。code

let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
//便利 y==0 x是任意值的元組
for (x, y) in points where y==0 {
    print("\(x) and \(y)")
}

枚舉用例模式 enumeration case pattern

枚舉用例模式匹配現有的某個枚舉類型的某個用例。枚舉用例模式出如今switch 語句中的 case 標籤中,以及if,while,guard,for-in語句的case條件中。get

可選項模式 optional pattern

可選項模式匹配 Optional 枚舉在some(Wrapped)中包裝的值。
可選項模式爲 for-in 語句提供了一種迭代數組的簡便方式,只爲數組中非 nil 的元素執行循環體
it

let someOptional: Int? = 42
if case .some(let x) = someOptional {
    print(x)//42
}

if case let x? = someOptional {
    print(x)//42
}

let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
for case let number? in arrayOfOptionalInts {
    print("fond a \(number)")//2,3,5
}

類型轉換模式 Type-Casting Pattern

有兩種類型轉換模式, is模式和as模式, is 模式只出如今switch語句中的case標籤中。
is 模式和 as 模式形式以下:
is 類型
模式 as 類型io

*** is 模式僅當一個值的類型在運行時和is模式右邊的指定類型一致,或者是其子類的狀況下,纔會匹配這個值。is模式和is 運算符有類似表現,它們均可進行類型轉換,可是is模式沒有返回類型
as 模式僅當一個值得類型在運行時和as模式右邊指定類型一致或者是其子類的狀況下,纔會匹配這個值,若是匹配成功,被匹配的值得類型被轉換成as模式右邊指定的類型 返回***ast

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 flyHeight: Int
}

struct Fish: Animal {
    var name: String {
        return "fish"
    }
    var depth: Int
}

let animals: [Any] = [Dog(runSpeed: 10), Bird(flyHeight: 1000), Fish(depth: 300)]
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) dive depth \(fish.depth)")
    case is Bird:
        print("bird can fly")
    default:
        print("unknown animal")
    }
}

表達式模式 expression pattern

表達式模式表明表達式模式的值,表達式模式出如今 switch語句的case標籤中
表達式模式表明的表達式會使用Swift 標準庫中的 ~= 運算符與輸入表達式的值進行比較。若是 ~= 運算符返回true, 則匹配成功。默認狀況下, ~= 運算符來比較兩個相同類型的值,它也能夠將一個整形數組與一個Range實例中的一段整數區間作匹配

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))")
}
:(1, 2) is near the origin.

自定義類型默認是沒法進行表達式模式匹配的,也須要重載 ~= 運算符

struct Employee {
    var salary: Int
}

//重載 ~= 才能對自定義的類進行 範圍模式匹配
func ~= (left: ClosedRange<Int>, right: Employee) -> Bool  {
    return left.contains(right.salary)
}

var e: Employee = Employee(salary: 1000)

switch e {
case 0...1000:
    print("窮")
case 1000...5000:
    print("湊合")
case 5000...1000:
    print("富")
default:
    print("土豪")
}
相關文章
相關標籤/搜索