欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift 5.1 之類型轉換與模式匹配的教程詳解

 更新時間:2020年05月29日 09:41:30   作者:沐靈洛  
這篇文章主要介紹了Swift 5.1 之類型轉換與模式匹配的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

類型轉換在Swift中使用 isas 操作符實現(xiàn)。

類型檢查

使用操作符 is 檢查一個實例是否是某個確定的類以及其繼承體系的父類或子類類型。如果是某個確定的類(該類繼承體系的父類或子類)類型,則返回 true ,否則返回 false 。

class Cat {
 func hairColor() -> String {
  return "五顏六色"
 }
}
class WhiteCat: Cat {
 override func hairColor() -> String {
  return "白色"
 }
}
class BlackCat: Cat {
 override func hairColor() -> String {
  return "黑色"
 }
}
//必須符合`Cat`類以及其子類,類型推斷需要
let kinds = [WhiteCat(),BlackCat(),WhiteCat(),WhiteCat()]
for item in kinds {
 if item is WhiteCat {
  print("白貓")//!< 3次
 }
 if item is BlackCat {
  print("黑貓")//!< 1次
 }
 if item is Cat {
  print("貓")//!< 4次
 }
}

向下轉換

某個類類型的常量或變量實際上可能是其子類的實例。這種情況下,我們會用到類型轉換操作符( as?as! )向下轉換為子類類型。

as? :類型轉換的條件形式,向下轉換為某個類型時,返回該類型的可選值,即:轉換失敗時返回 nil 。使用場景:向下轉換可能會失敗的情況。

as! :類型轉換的強制形式,向下轉換為某個類型時,會進行強制解包,即:轉換失敗時觸發(fā)運行時錯誤。使用場景:向下轉換確定不會失敗

//必須符合`Cat`類以及其子類,類型推斷需要
let kinds = [WhiteCat(),BlackCat(),WhiteCat(),WhiteCat()]
for item in kinds {
 if let white = item as? WhiteCat {
  print("毛發(fā):\(white.hairColor())")
 }
 if let black = item as? BlackCat {
  print("毛發(fā):\(black.hairColor())")
 }
}

下述內容總結自 蘋果官方博客

Swift 1.2之前 as 運算符可以執(zhí)行兩種不同類型的轉換:保證轉換和強制轉換。

保證轉換:保證將一種類型的值轉換為另一種類型,這種保證由編譯器編譯時驗證。

例如:

• 向上轉換(Upcasting),將當前類型的值轉換為該類型的父類之一。

• 指定數(shù)字的類型: let num = 6 as Float

**強制轉換:**強制將一種類型的值轉換為另一種類型,這種轉換編譯器無法保證安全性,并且可能觸發(fā)運行時錯誤。

例如:上述的向下轉換(Downcasting),將一種類型的值轉換為其子類之一。 在Swift 1.2之后保證轉換仍然使用 as 操作符,但強制轉換使用 as! 操作符。

AnyAnyObject 的類型轉換

Swift提供了兩種特殊類型來處理非特定類型:

any
AnyObject

在某些使用 anyAnyObject 的特殊場景下,對于 AnyAnyObject 表示的實例,需要運用類型轉換模式,值綁定模式,表達式模式等模式匹配的知識。所以我們先介紹下Swift中的模式。

類型轉換模式

類型轉換有兩種模式: is 模式和 as 模式。 is 模式僅在 switch 語句的 case 標簽中使用。 is 模式和 as 模式有如下形式:

is <#Type#>
//pattern:代表此處也需要一個模式
<#pattern#> as <#Type#>

is 模式: 如果運行時值的類型與 is 模式右側指定的類型或該類型的子類相同,則 is 模式會匹配到這個值。此行為很適用 switch 語句的 case 場景。 is 模式的行為類似于 is 運算符,因為它們都執(zhí)行類型轉換但類型轉換后丟棄了返回的類型。

as 模式: 如果在運行時值的類型與 as 模式右側指定的類型或該類型的子類相同,則 as 模式會匹配到這個值。如果匹配成功,則會將匹配到的值的類型將轉換為 as 模式右側指定的類型。

值綁定模式

值綁定模式將匹配到的值綁定到變量或常量。 將匹配到的值綁定到常量,綁定模式以let關鍵字開頭;綁定到變量以var關鍵字開頭。

let point = (3,2)
switch point {
case let(x,y):
 //值綁定模式匹配到的X值:3,Y值:2
 print("值綁定模式匹配到的X值:\(x),Y值:\(y)")
}

通配符模式

通配符模式匹配并忽略任何值,并由下劃線 _ 表示。

for _ in 1...9 {
 print("通配符模式")
}

標識符模式

標識符模式匹配任何值,并將匹配的值綁定到變量或常量的名稱。

let someValue = 42

someValue 是一個與 Int 類型的值 42 匹配的標識符模式。匹配成功, 42 將被賦值給常量 someValue 。 當變量或常量聲明的左側的模式是標識符模式時,標識符模式隱式地是值綁定模式的子模式。 ####元組模式 元組模式是以逗號分隔的零個或多個元素列表,括在括號中。元組模式匹配相應元組類型的值。

包含單個元素的元組模式周圍的括號無效。該模式匹配該單個元素類型的值。所以下面寫法是等效的:

let a = 2  // a: Int = 2
let (a) = 2  // a: Int = 2
let (a): Int = 2 // a: Int = 2

枚舉 Case 模式

枚舉 Case 模式匹配現(xiàn)有枚舉中存在 case 。枚舉 Case 模式出現(xiàn)在 switch 語句的case標簽中以及 if , while ,  guard , for - in 語句中。

如果嘗試匹配的枚舉 case 具有關聯(lián)值,則相應的枚舉 Case 模式必須指定與每個關聯(lián)值對應的元組。

enum VendingMachineError {
 case InvalidGoods//!< 商品無效
 case StockInsufficient//!< 庫存不足
 case CoinInsufficient(coinNeeded:Int,caseDes:String)
}
let enumArray = [VendingMachineType.CoinInsufficient(coinNeeded: 4, caseDes: "自動售貨機,硬幣不足,請補充"),
     .InvalidGoods,
     .StockInsufficient,
     .CoinInsufficient(coinNeeded: 6, caseDes: "自動售貨機,硬幣不足,超過限額")]
for patternCase in enumArray {
 switch patternCase {
 case .CoinInsufficient(coinNeeded: let x, caseDes: let y) where x > 5:
  print(x,y)
 case let .CoinInsufficient(coinNeeded: x, caseDes: y):
  print(x,y)
 case .InvalidGoods:
  print("商品無效")
 default:
  print("未匹配到")
 }
}

枚舉 Case 模式還匹配枚舉類型的可選項。當可選項 Optional 是枚舉類型時, .none 和 .some 能夠作為枚舉類型的其他 case 出現(xiàn)在同一個 switch 語句中。這種簡化的語法允許我們省略可選模式。

enum SomeEnum { case left, right,top,down}
let array : Array<SomeEnum?> = [.left,nil,.right,.top,.down]
//方式一:
array.forEach { (item) in
 switch item {
 case .left?:
  print("左")
 case SomeEnum.right?:
  print("右")
 case .down?:
  print("下")
 case .top?:
  print("上")
 default:
  print("沒有值")
 }
}
//方式二:
array.forEach { (item) in
 switch item {
 case .some(let x):
  print("對可選項item進行解包得到:\(x)")//!< left,right,top,down
 case .none:
  print("沒有值") //nil
 }
}

可選模式

可選模式匹配包含在 Optional<Wrapped> 枚舉(這是可選項的實現(xiàn)原理)對應的 case 項: some(Wrapped) 中的值。即匹配可選項有值的情況。

public enum Optional<Wrapped> : ExpressibleByNilLiteral {
 /// The absence of a value.
 /// In code, the absence of a value is typically written using the `nil`
 /// literal rather than the explicit `.none` enumeration case.
 case none
 /// The presence of a value, stored as `Wrapped`.
 case some(Wrapped)
 ......
}

可選模式由標識符模式組成后面緊跟 ? 并出現(xiàn)在與枚舉 Case 模式相同的位置。 因為可選模式是 Optional<Wrapped> 枚舉的 Case 模式語法糖。所以下面兩種寫法是等效的:

let someInt : Int? = 42
//方式一:枚舉case模式
if case let .some(x) = someInt {
 print(x)
}
if case .some(let x) = someInt {
 print(x)
}
//方式二:可選模式
if case let x? = someInt {
 print(x)
}

使用可選模式迭代包含可選項的數(shù)組是很方便的:

enum SomeEnum { case left, right,top,down}
let array : Array<SomeEnum?> = [.left,nil,.right,nil,.top,.down]
for case let item? in array {
 print(item)//!< log:left right top down
}
for case let .some(item) in array {
 print(item)//!< log:left right top down
}
for case .some(let item) in array {
 print(item)//!< log:left right top down
}

表達式模式

表達式模式:表示表達式的值,僅出現(xiàn)在 switch 語句的 case 標簽中。

表達式模式的機制:使用Swift標準庫中的 ~= 操作符將表達式模式中表達式的值與匹配值(輸入值)進行比較,若 ~= 返回 true 則證明匹配成功,否則匹配失敗。

~= 運算符默認情況下使用 == 運算符比較兩個相同類型的值;也可以通過檢查某個值是否在某個范圍內來匹配范圍值。

let point = (9,14)
switch point {
case (9,14):
 print("表達式模式使用`~=`精準匹配::(\(point.0),\(point.1))")
 fallthrough
case (5..<10,0...20):
 print("表達式模式使用`~=`范圍匹配:(\(point.0),\(point.1))")
default:
 print("未匹配")
}

可以重載 〜= 運算符提供自定義表達式匹配行為:

//全局聲明:class外部,否則報錯
func ~= (pattern: String, value: Int) -> Bool {
 return pattern == "\(value)"
}
let point = (9,14)
switch point {
case ("9","14")://若不重載則會報錯
 print("表達式模式使用`~=`精準匹配:(\(point.0),\(point.1))")
 fallthrough
case (5..<10,0...20):
 print("表達式模式使用`~=`范圍匹配:(\(point.0),\(point.1))")
default:
 print("未匹配")
}

介紹完模式,接下來我們舉例來說明模式在 Any 和 AnyObject 的類型轉換的使用。 示例一:

var things : [Any] = [0, 0.0, 42, 3.14159, "hello", (3.0, 5.0),
      WhiteCat(),{ (name: String) -> String in "Hello, \(name)" } ]
for thing in things {
 switch thing {
 case 0 as Int:
  print("`as`模式匹配兩部分,pattern:表達式模式(`0`),type:匹配類型(`Int`),匹配結果:0")
 case (0) as Double:
  print("`as`模式匹配兩部分,pattern:表達式模式(`0`),type:匹配類型(`Double`),匹配結果:0.0")
 case is Double:
  print("`is`模式匹配`Double`類型的值,值類型與`is`右側類型及子類相同時,執(zhí)行此句")
 case let someInt as Int:
  print("`as`模式匹配兩部分,pattern:值綁定模式(`let someInt`),type:匹配類型(`Int`),匹配結果:\(someInt)")
 case _ as Int:
  print("`as`模式匹配兩部分,pattern:通配符模式(`_`),type:匹配類型(`Int`),匹配結果被忽略")
 case let someDouble as Double where someDouble > 0:
  print("`as`模式匹配兩部分,pattern:值綁定模式(`let someDouble`),type:匹配類型(`Double`),匹配結果:\(someDouble)")
 case let someString as String:
  print("`as`模式匹配兩部分,pattern:值綁定模式(`let someString`),type:匹配類型(`String`),匹配結果:\(someString)")
 case let (x, y) as (Double, Double):
  print("`as`模式匹配兩部分,pattern:元組模式(`let (x, y) `),type:匹配類型(元組`(Double, Double)`),匹配結果:\((x, y))")
  fallthrough
 case (2.0...4.0, 3.0...6.0) as (Double, Double):
  print("`as`模式匹配兩部分,pattern:表達式模式(`(2.0...4.0, 3.0...6.0) `),type:匹配類型(元組`(Double, Double)`))")
 case let cat as WhiteCat:
  print("`as`模式匹配兩部分,pattern:值綁定模式(`let cat`),type:匹配類型(對象`WhiteCat`),匹配結果:\(cat)")
 case let sayHelloFunc as (String) -> String:
  print("`as`模式匹配兩部分,pattern:值綁定模式(`let sayHelloFunc`),type:匹配類型(函數(shù)`(String) -> String`),匹配結果:\(sayHelloFunc("QiShare"))")
 default:
  print("其他結果,未匹配到")
 }
}

示例二:

let point = (9,14)
switch point {
case (9,14):
 print("表達式模式使用`~=`精準匹配::(\(point.0),\(point.1))")
 fallthrough
case (5..<10,0...20):
 print("表達式模式使用`~=`范圍匹配:(\(point.0),\(point.1))")
default:
 print("未匹配")
}

參考資料: swift 5.1官方編程指南

總結

到此這篇關于Swift 5.1 之類型轉換與模式匹配的教程詳解的文章就介紹到這了,更多相關Swift 類型轉換與模式匹配內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • swift中可選值?和!使用的方法示例

    swift中可選值?和!使用的方法示例

    這篇文章主要給大家介紹了關于swift中可選值?和!使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • Swift中定義二維數(shù)組的方法及遍歷方法示例

    Swift中定義二維數(shù)組的方法及遍歷方法示例

    這篇文章主要介紹了Swift中定義二維數(shù)組的方法及遍歷方法示例,本文直接給出代碼示例,需要的朋友可以參考下
    2015-07-07
  • 深入講解Swift中的模式匹配

    深入講解Swift中的模式匹配

    在Swift中,一些模式已經(jīng)被語言特性所吸收,你在使用Swift甚至察覺不出這類問題的存在,下面這篇文章主要給大家介紹了關于Swift中模式匹配的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08
  • Swift3.0仿支付寶二維碼掃描效果

    Swift3.0仿支付寶二維碼掃描效果

    這篇文章主要為大家詳細介紹了Swift3.0仿支付寶二維碼掃描效果的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI是一種使用Swift語言在蘋果設備上構建用戶界面的創(chuàng)新且簡單的方式,下面這篇文章主要給大家介紹了關于SwiftUI圖片縮放、拼圖等處理的相關資料,需要的朋友可以參考下
    2021-08-08
  • Swift協(xié)議Protocol介紹

    Swift協(xié)議Protocol介紹

    協(xié)議規(guī)定了用來實現(xiàn)某一特定功能所必需的方法和屬性。任意能夠滿足協(xié)議要求的類型被稱為遵循(conform)這個協(xié)議。類,結構體或枚舉類型都可以遵循協(xié)議,并提供具體實現(xiàn)來完成協(xié)議定義的方法和功能
    2022-08-08
  • Swift并發(fā)系統(tǒng)并行運行多個任務使用詳解

    Swift并發(fā)系統(tǒng)并行運行多個任務使用詳解

    這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運行多個任務使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 利用Swift如何判斷iPhone X機型詳解

    利用Swift如何判斷iPhone X機型詳解

    近日,iPhone X的發(fā)布在人們群眾引起了很大的轟動,下面這篇文章主要給大家介紹了關于利用Swift如何判斷iPhone X機型的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-09-09
  • Swift學習筆記之構造器重載

    Swift學習筆記之構造器重載

    Swift 將為所有屬性已提供默認值的且自身沒有定義任何構造器的結構體或基類,提供一個默認的構造器。這個默認構造器將簡單的創(chuàng)建一個所有屬性值都設置為默認值的實例。
    2014-11-11
  • 深入探究Swift枚舉關聯(lián)值的內存

    深入探究Swift枚舉關聯(lián)值的內存

    這篇文章主要給大家介紹了關于Swift枚舉關聯(lián)值的內存的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Swift具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08

最新評論