天天看點

Swift模式參考!

模式代表了單值或組合值的結構。例如,元組(1,2) 的結構是用逗号分隔兩個元素的清單。因為模式代表一種值的結構,而不是一個任何一個特殊的值,你可以用多種值與之比對。舉個例子,模式 (x,y) 可以比對元組 (1,2) 以及其他任何兩個元素的元組。除了将一個值與模式比對,你還可以提取組合值的部分或全部,然後把各部分綁定到常量或變量上。

在 Swift 中,模式出現在變量和常量的聲明中(在它們的左邊),在 for-in 語句和 switch 語句(在他們的 case 标簽)中。雖然模式可能出現在 switch 語句的任何一個 case 标簽中,但是在其他情況下,隻有通配符模式,辨別符模式,以及包含這兩種模式的模式才能夠出現。

你可以為通配符模式,辨別符模式,以及元組模式指定一個類型注釋,以限制模式隻比對符合特定類型的值。

模式的文法 pattern → identifier-pattern­type-annotation­opt­ pattern → value-binding-pattern­ pattern → tuple-pattern­type-annotation­opt ­ pattern → enum-case-pattern­ pattern → type-casting-pattern­ pattern → expression-pattern
作為一個開發者,有一個學習的氛圍跟一個交流圈子特别重要,這是一個我的iOS開發交流群:130 595 548,不管你是小白還是大牛都歡迎入駐 ,讓我們一起進步,共同發展!(群内會免費提供一些群主收藏的免費學習書籍資料以及整理好的幾百道面試題和答案文檔!)

通配符模式 比對并忽略任何值,包括下劃線(_)。當你不關心被比對的值時,可以使用通配符模式。比如說,下面的代碼在閉區間 1...3 中疊代,并忽略每次疊代時區間的目前值:

通配符模式的文法 wildcard-pattern → _­

辨別符模式 比對任何值,并将比對的值綁定到一個變量或常量上。例如,在下面的常量聲明中,someValue 是一個比對了 Int 型的值為 42 的辨別符模式。

當比對成功時,42 被綁定(指派)到常量 someValue。

當一個變量或常量聲明左側的模式是辨別符模式時,該辨別符模式是隐式的值綁定模式。

辨別符模式的文法 identifier-pattern → identifier­

值綁定模式 綁定比對的值到變量或常量。綁定比對值到常量名時,值綁定模式以關鍵字 let 開頭;而綁定值到變量名時,以關鍵字 var 開頭。

辨別符模式包含于值綁定模式中綁定新命名的變量或常量到它們比對的值上。例如,你可以分解一個元組的元素并把每個元素的值綁定到相應的辨別符模式。

在上面的例子中,let 将元組模式 (x, y) 的元素配置設定到各個辨別符模式。由于這個行為,switch 語句 case let (x, y): 和case (let x, let y): 比對的值是一樣的。

值綁定模式的文法 value-binding-pattern → var­pattern­ let­pattern­

元組模式 是包含零個或多個模式由一個逗号分隔的清單,包含在括号中。元組模式比對相應元組類型的值。

你可以通過使用類型注釋來限制一個元組模式,以比對特定種類的元組類型。例如,在常量聲明 let (x, y): (Int, Int) = (1, 2) 中的元組模式 (x, y): (Int, Int),隻比對兩個元素都是 Int 型的元組。如果隻需要限制元組模式中的一些元素,直接向這些單個元素提供類型注釋即可。例如,在 let (x: String, y) 中的元組模式比對任意包含兩個元素且第一個元素是 String 型的元組類型。

當元組模式被用作 for-in 語句或者變量或常量申明的模式時,它隻能包含通配符模式,辨別符模式或者其他包含兩者的模式。例如,下面的代碼是不合法的,因為 (x, 0) 中的元素 0 是一個表達式模式:

圍繞隻包含單個元素的元組模式的括号是不起作用的。模式比對單個元素類型的值。例如,下面的式子是等價的:

元組模式的文法 tuple-pattern → (tuple-pattern-element-list opt) tuple-pattern-element-list → tuple-pattern-element | tuple-pattern-element, tuple-pattern-element-list tuple-pattern-element → pattern

枚舉執行個體模式 比對現有的枚舉類型的執行個體。枚舉執行個體模式隻出現在 switch 語句的 case 标簽中。

如果你準備比對的枚舉執行個體有任意關聯的值,則相應的枚舉執行個體模式必須指定一個包含每個關聯值元素的元組模式。使用 switch語句來比對包含關聯值枚舉執行個體的例子,請參閱 Associated Values。

枚舉執行個體模式的文法 enum-case-pattern → type-identifier opt . enum-case-name tuple-pattern opt

類型轉換模式有兩種,is 模式和 as 模式。兩種模式都隻出現在 switch 語句中的 case 标簽中。is 模式和 as 模式有下面的形式:

如果一個值的類型在運作時和 is 模式右側的指定類型或者指定類型的子類是相同的,那麼 is 模式會比對該值。is 模式的行為就像 is 操作符一樣,他們都進行類型轉換,但是舍棄了傳回類型。

如果一個值的類型在運作時(runtime)和 as 模式右邊的指定類型或者指定類型的子類是相同的,那麼 as 模式會比對該值。如果比對成功,比對值的類型将被轉換成 as 模式左邊指定的模式。

使用 switch 語句比對使用 is 模式和 as 模式的值的例子,請參閱 Type Casting for Any and AnyObject。

類型轉換模式的文法 type-casting-pattern → is-pattern­ as-pattern­ is-pattern → is­type­ as-pattern → pattern­as­type­

表達式模式 代表了一個表達式的值。表達式模式隻出現在 switch 語句中的 case 标簽中。

由表達式模式所代表的表達式通過使用 Swift 标準庫中的 ~= 操作符與輸入表達式的值進行比較。如果 ~= 操作符傳回 true,則比對成功。預設情況下,~= 操作符使用 == 操作符來比較兩個相同類型的值。它也可以将一個整數值與一個 Range 對象中的整數範圍比對,如下面的例子所示:

你可以重載 ~= 操作符來提供自定義表達式的比對行為。例如,你可以重寫上面的例子以比較 point 表達式和點的字元串表示形式。

表達式模式的文法 expression-pattern → expression­