亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

深入解析Swift中switch語句對case的數(shù)據(jù)類型匹配的支持

2020-03-09 17:49:00
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Swift中switch語句對case的數(shù)據(jù)類型匹配的支持,Swift中switch...case語句支持多種數(shù)據(jù)類型的匹配判斷,十分強大,需要的朋友可以參考下
 

Swift可以對switch中不同數(shù)據(jù)類型的值作匹配判斷:

var things = Any[]()things.append(0)things.append(0.0)things.append(42)things.append(3.14159)things.append("hello")things.append((3.0, 5.0))things.append(Movie(name:"Ghostbusters", director:"Ivan Reitman"))for thing in things { switch thing { case 0 as Int: println("zero as an Int") case 0 as Double: println("zero as a Double") case let someInt as Int: println("an integer value of (someInt)") case let someDouble as Double where someDouble > 0: println("a positive double value of (someDouble)") case is Double: println("some other double value that I don't want to print") case let someString as String: println("a string value of "(someString)"") case let (x, y) as (Double, Double): println("an (x, y) point at (x), (y)") case let movie as Movie: println("a movie called '(movie.name)', dir. (movie.director)")default: println("something else")}}// zero as an Int// zero as a Double// an integer value of 42// a positive double value of 3.14159// a string value of"hello"// an (x, y) point at 3.0, 5.0// a movie called 'Ghostbusters', dir. Ivan Reitman

這里面會根據(jù)thing的值進行匹配,到對應(yīng)的case當中。

今天突然想到一個問題,讓我覺得有必要總結(jié)一下switch語句。我們知道swift中的switch,遠比C語言只能比較整數(shù)強大得多,但問題來了,哪些類型可以放到switch中比較呢,對象可以比較么?

官方文檔對switch的用法給出了這樣的解釋:

Cases can match many different patterns, including interval matches, tuples, and casts to a specific type.
也就是說除了最常用的比較整數(shù)、字符串等等之外,switch還可以用來匹配范圍、元組,轉(zhuǎn)化成某個特定類型等等。但文檔里這個including用的實在是無語,因為它沒有指明所有可以放在switch中比較的類型,文章開頭提出的問題依然沒有答案。

我們不妨動手試一下,用switch匹配對象:

class A {}var o = A()var o1 = A()var o2 = A()switch o {case o1:  print("it is o1")case o2:  print("it is o2")default:  print("not o1 or o2")}

果然,編譯器報錯了:“Expression pattern of type 'A' cannot match values of type 'A'”。至少我們目前還不明白“expression pattern”是什么,怎么類型A就不能匹配類型A了。

我們做一下改動,在case語句后面加上let:

switch o {case let o1:  print("it is o1")case let o2:  print("it is o2")default:  print("not o1 or o2")}

OK,編譯運行,結(jié)果是:it is o1。這是因為case let不是匹配值,而是值綁定,也就是把o的值賦給臨時變量o1,這在o是可選類型時很有用,類似于if let那樣的隱式解析可選類型。沒有打出it is o2是因為swift中的switch,只匹配第一個相符的case,然后就結(jié)束了,即使不寫break也不會跳到后面的case。

扯遠了,回到話題上來,既然添加let不行,我們得想別的辦法。這時候不妨考慮一下switch語句是怎么實現(xiàn)的。據(jù)我個人猜測,估計類似于用了好多個if判斷有沒有匹配的case,那既然如此,我們給類型A重載一下==運算符試試:

class A {}func == (lhs: A, rhs: A) -> Bool { return true }var o = A(); var o1 = A() ;var o2 = A()switch o {case o1:  print("it is o1")case o2:  print("it is o2")default:  print("not o1 or o2")}

很顯然,又失敗了。如果這就能搞定問題,那這篇文章也太水了。報錯信息和之前一樣??蓡栴}是我們已經(jīng)重載了==運算符,為什么A類型還是不能餓匹配A類型呢,難道switch不用判斷兩個變量是否相等么。

switch作為一個多條件匹配的語句,自然是要判斷變量是否相等的,不過它不是通過==運算符判斷,而是通過~=運算符。再來看一段官方文檔的解釋:

An expression pattern represents the value of an expression. Expression patterns appear only in switch statement case labels.
以及這句話:

The expression represented by the expression pattern is compared with the value of an input expression using the Swift standard library ~= operator.
第一句解釋了之前的報錯,所謂的“express pattern”是指表達式的值,這個概念只在switch的case標簽中有。所以之前的報錯信息是說:“o1這個表達式的值(還是o1)與傳入的參數(shù)o都是類型A的,但它們無法匹配”。至于為什么不能匹配,答案在第二句話中,因為o1和o的匹配是通過調(diào)用標準庫中的~=運算符完成的。

所以,只要把重載==換成重載~=就可以了。改動一個字符,別的都不用改,然后程序就可以運行了。Swift默認在~=運算符中調(diào)用==運算符,這也就是為什么我們感覺不到匹配整數(shù)類型需要什么額外處理。但對于自定義類型來說,不重載~=運算符,就算你重載了==也是沒用的。

除此以外,還有一種解決方法,那就是讓A類型實現(xiàn)Equatable協(xié)議。這樣就不需要重載~=運算符了。答案就在Swift的module的最后幾行:

@warn_unused_resultpublic func ~=<T : Equatable>(a: T, b: T) -> Bool

Swift已經(jīng)為所有實現(xiàn)了Equatable協(xié)議的類重載了~=運算符。雖然實現(xiàn)Equatable協(xié)議只要求重載==運算符,但如果你不顯式的注明遵守了Equatable協(xié)議,swift是無法知道的。因此,如果你重載了==運算符,就順手標注一下實現(xiàn)了Equatable協(xié)議吧,這樣還有很多好處,比如SequenceType的split方法等。

最后總結(jié)一句:

能放在switch語句中的類型必須重載~=運算符,或者實現(xiàn)Equatable協(xié)議。



注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
中文字幕av资源一区| 国产乱码精品一区二区三区av| 中文字幕1区2区3区| 亚洲成人av在线| 麻豆明星ai换脸视频| 欧美日韩久久婷婷| 欧美人成在线观看ccc36| 欧美日韩性视频| 国产主播福利在线| 亚洲第一成肉网| 一级片在线观看视频| 欧美国产日韩a欧美在线观看| 欧美日韩精品一区二区| 9191在线播放| 久久精品小视频| 天天躁日日躁aaaa视频| 久久久久久国产精品免费无遮挡| 欧美成人三级视频网站| 国产目拍亚洲精品99久久精品| 久久久一本精品99久久精品66| 日韩一区二区中文| 国产香蕉视频在线看| 成人免费观看cn| 一卡二卡欧美日韩| www.伊人久久| 亚洲国产成人av好男人在线观看| 国产成人无码精品久久二区三| 一本色道88久久加勒比精品| 天堂а√在线8种子蜜桃视频| 亚洲欧洲偷拍精品| 电影av一区| 奇米一区二区三区四区久久| 久久久久福利视频| 亚洲欧洲精品一区二区三区不卡| 中文在线字幕观看| 国产玉足脚交久久欧美| 亚洲熟妇无码一区二区三区导航| 久cao在线| 久久人妻少妇嫩草av无码专区| 91精品国产乱码久久久久久蜜臀| www日本黄色| 超碰在线94| 中日韩av在线| 成人免费在线一区二区三区| 中文文字幕一区二区三三| 日韩精品视频网站| 麻豆传传媒久久久爱| 亚洲色欲久久久综合网东京热| 午夜视频在线免费播放| 天堂网www在线资源中文| 精品无码黑人又粗又大又长| 国产精品亚洲综合色区韩国| 日本黄色片免费观看| 亚洲 欧美 中文字幕| 久草福利资源在线观看| 国产精品二区不卡| 欧美中日韩免费视频| 麻豆影院在线观看| 成人国产精品一级毛片视频| 操人真爽免费视频| 农村妇女精品一区二区| 国产精品久久看| 女人香蕉久久**毛片精品| 久草综合在线| 国产啪精品视频| 99久久精品一区二区成人| jizz亚洲女人高潮大叫| 久久国产精品视频| 欧美性生活大片免费观看网址| 天堂资源在线视频| 五月天婷婷丁香网| 国产欧美一区二区三区久久人妖| 日日夜夜亚洲精品| 一区二区三区视频观看| 亚洲熟妇av乱码在线观看| 亚洲免费在线观看| 国产精品二区三区| 在线视频亚洲自拍| 另类小说综合欧美亚洲| 日韩一区二区av| 麻豆网站在线| 国产精品白丝jk白祙喷水网站| 免费黄网大全| 欧美久久久久免费| 成人久久网站| 国产精品三区www17con| 一区二区三区视频在线观看| 韩国三级av在线免费观看| 最新不卡av| 亚洲第一视频在线播放| 亚洲欧美自偷自拍| 久草免费福利视频| 国产精品mv在线观看| 亚洲欧洲综合网| f2c人成在线观看免费视频| 国产一本一道久久香蕉| 国产情侣呻吟对白高潮| 色综合色综合网色综合| 51一区二区三区| 国产欧美一区二区精品秋霞影院| www.精选视频.com| 超薄丝袜一区二区| 3d玉蒲团在线观看| 91久久综合亚洲鲁鲁五月天| 亚洲一区二三区| 神马久久久久久| xxxxwwww欧美| 黄色软件视频在线观看| 羞羞视频在线观看一区二区| 久久久一区二区三区不卡| 久久黄色片视频| 免费污污视频在线观看| 天天爱天天干天天操| 国产精品888| 黑人精品一区二区三区| 欧美日韩国产在线播放| 亚洲高清免费一级二级三级| 亚洲综合极品香蕉久久网| 国内精久久久久久久久久人| 理论不卡电影大全神| 日韩av电影免费播放| 性感美女一级片| 欧美一级黄色片视频| 国产精品久久久久久麻豆一区软件| 欧美日韩综合另类| 午夜成人免费电影| 一本色道久久综合一区| 日韩av图片| 欧美最猛性xxxxx亚洲精品| 久久你懂得1024| 国产亚洲精品成人| 一个色综合网站| 中文字幕精品无| 一区二区三区短视频| 日本波多野结衣在线| 国产高清精品一区二区| 久久中文字幕免费| 亚洲AV无码精品自拍| 国产精品一二三四| 激情五月少妇a| 欧美日韩一区二区在线播放| 久久综合九色欧美综合狠狠| 国产国产一区| 91在线精品| 亚洲第一二三区| 97久久精品午夜一区二区| 一本大道香蕉久久| 福利一区二区免费视频| 69视频在线免费观看| 美女做暖暖视频免费在线观看全部网址91| 岛国视频午夜一区免费在线观看| 成人免费视频观看视频| 漂亮人妻被中出中文字幕| 不卡的av一区| eeuss一区| 精品久久亚洲| 精品视频一区二区三区四区五区| 男男视频亚洲欧美| 国产一区二区四区| 中文字幕乱伦视频| 亚洲激情视频一区| 日韩一级片在线免费观看| 日本50路肥熟bbw| 日本在线视频播放| 四虎中文字幕| 欧美色123| 日韩午夜电影免费看| 亚洲欧美在线第一页| 影音先锋男人每日资源站| 欧美中文字幕视频| 99精品在线免费视频| 国产传媒一区二区三区| 精品一区二区三区免费| 欧美老妇交乱视频| 免费成人在线观看av| 给个网站可以在线观看你懂的| 国产a级片网站| 色视频在线看| 久热中文字幕在线精品免费| 国产美女精彩久久| 国产精品对白一区二区三区| 亚洲午夜激情网页| 蜜臀av性久久久久蜜臀av麻豆| 亚洲一区国产| 亚洲区小说区图片区qvod| 五月天一区二区三区| 欧美双性人妖o0| 欧美福利网站| 亚洲av无码精品一区二区| 黄色三级视频片| 椎名由奈av一区二区三区| 午夜在线观看视频网站| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩精品一区二区三区四区五区| 成人黄色网免费| 91最新网址| 中文字幕乱码日本亚洲一区二区| 亚洲蜜桃av| 先锋影音欧美| av网站在线免费播放| 国产成人精品免费网站| 狠狠精品干练久久久无码中文字幕| 色资源二区在线视频| 爽爽淫人综合网网站| 久久夜色精品国产噜噜av小说| 阿v天堂2014| 亚洲电影一级片| 亚洲 欧美 激情 小说 另类| 国产jzjzjz丝袜老师水多| 懂色av粉嫩av蜜乳av| 青娱乐精品视频| 四虎影成人精品a片| 国产69精品久久久久久久| 日韩和的一区二在线| 亚洲第一视频| 欧美在线高清| 136福利视频导航| 亚洲同性gay激情无套| 国产精品23p| 国产在线不卡av| 欧美精品一区二区三区三州| 欧美在线观看视频一区二区三区| 我不卡神马影院| 欧美在线免费看视频| 亚洲成av人影片在线观看| 欧美性猛交xxxx黑人| 91国在线产| 亚洲成在线观看| 国产欧美69| 欧美一级视频在线播放| 色综久久综合桃花网| 国产乱视频在线观看| 国产精品久久久久久久久粉嫩av| 欧美e片成人在线播放乱妇| 国产精品天天看天天狠| 国产成人a亚洲精v品无码| 亚洲美女福利视频| 国产成人精品一区二区色戒| 97国产一区二区精品久久呦| 男人网站在线观看| h视频在线网站| 欧美日韩黄色影视| 精品在线观看入口| 国产又爽又黄的视频| 欧美国产精品专区| 91麻豆精品91久久久久同性| 日韩av中文在线| 日本一区二区久久精品| 欧美超级免费视 在线| www.久久久久久.com| 久久好看免费视频| 18禁免费无码无遮挡不卡网站| 欧美高清3dfreexxxx性| 黄色免费在线播放| 国产精品亚洲一区二区无码| 亚洲精品欧美激情| bt电影在线| 快色在线观看| 久久大胆人体视频| 亚洲一级不卡视频| 亚洲欧美激情网| 最新中文字幕一区二区三区| 欧美成年人视频网站欧美| 欧美一区二区三区人| 亚洲一区二区中文在线| 一区二区三区**美女毛片| 国产欧美在线观看| 午夜国产视频| 91精品人妻一区二区三区蜜桃欧美| 五月天中文字幕在线| 污黄视频在线看| 国产亚洲一区二区精品| 一二三四在线观看免费高清中文在线观看| 日本在线免费网| 亚洲伊人成综合成人网| 国产婷婷精品| 国产传媒第一页| 99精品视频在线| 国产精品麻豆一区二区| 五月天欧美精品| 污污网站在线看| 欧美精品一区在线播放| 色噜噜狠狠色综合网图区| 久久99青青| 尤物tv在线精品| 欧亚精品一区| 亚洲精品免费播放| 欧美日韩欧美| 九色在线视频观看| www.色婷婷.com| 91丝袜美腿高跟国产极品老师| dy888亚洲精品一区二区三区| 国产亚洲成av人片在线观黄桃| 国产乱码精品一区二区三区av| 国产精品一区二区欧美| 日本午夜精品久久久久| 国产精欧美一区二区三区蓝颜男同| 精品成人一区二区三区四区| 精品无码久久久久久久动漫| 久久久久久久久久久久久国产精品| 成人日韩av| 800av免费在线观看| 91蝌蚪porny成人天涯| 欧美日韩中文国产一区发布| 国产精品欧美日韩久久| 久久99精品久久久水蜜桃| 国产精品99久久久久久似苏梦涵| 手机在线视频你懂的| 九色porny蝌蚪视频在线观看| a∨色狠狠一区二区三区| 中文字幕精品综合| 黄色18在线观看| 性一交一乱一精一晶| 一本色道久久综合亚洲| 亚洲激情六月丁香| 日本高清不卡一区二区三区视频| 久久精品视频播放| 免费在线黄色网| 国产欧美日韩精品在线观看| 青青操在线视频观看| 青青精品视频播放| 蜜桃视频在线入口www| 97精品国产综合久久久动漫日韩| 一级毛片久久久| 国产成人久久精品麻豆二区| se69色成人网wwwsex| 欧美精品丝袜中出| 久久久久久亚洲综合影院红桃|