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

首頁 > 編程 > Swift > 正文

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

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

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

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

這里面會根據thing的值進行匹配,到對應的case當中。

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

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

Cases can match many different patterns, including interval matches, tuples, and casts to a specific type.
也就是說除了最常用的比較整數、字符串等等之外,switch還可以用來匹配范圍、元組,轉化成某個特定類型等等。但文檔里這個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,編譯運行,結果是:it is o1。這是因為case let不是匹配值,而是值綁定,也就是把o的值賦給臨時變量o1,這在o是可選類型時很有用,類似于if let那樣的隱式解析可選類型。沒有打出it is o2是因為swift中的switch,只匹配第一個相符的case,然后就結束了,即使不寫break也不會跳到后面的case。

扯遠了,回到話題上來,既然添加let不行,我們得想別的辦法。這時候不妨考慮一下switch語句是怎么實現的。據我個人猜測,估計類似于用了好多個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")}

很顯然,又失敗了。如果這就能搞定問題,那這篇文章也太水了。報錯信息和之前一樣??蓡栴}是我們已經重載了==運算符,為什么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)與傳入的參數o都是類型A的,但它們無法匹配”。至于為什么不能匹配,答案在第二句話中,因為o1和o的匹配是通過調用標準庫中的~=運算符完成的。

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

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

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

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

最后總結一句:

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



注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品在线观看| 欧美超级乱淫片喷水| 亚洲人成伊人成综合网久久久| 亚洲女人天堂色在线7777| 国产精品福利在线观看网址| 国产美女久久精品| 国产精品偷伦视频免费观看国产| 狠狠色狠狠色综合日日五| 成人网欧美在线视频| 国产精品日韩在线一区| 亚洲欧洲美洲在线综合| 大荫蒂欧美视频另类xxxx| 国产精品成人免费电影| 最近2019年手机中文字幕| 国产精品视频白浆免费视频| 亚洲精品电影久久久| 国产美女精彩久久| 国产成人激情视频| 久久久久久久国产| 91久久精品久久国产性色也91| 日韩国产精品亚洲а∨天堂免| 亚洲福利小视频| 亚洲系列中文字幕| 日韩欧美一区二区三区久久| 日韩美女免费线视频| 久久久久久久久久久免费精品| 国产一区二区视频在线观看| 97国产成人精品视频| 日韩有码在线视频| 亚洲精品欧美日韩专区| 日本久久久久久久久久久| 欧美限制级电影在线观看| 91久久综合亚洲鲁鲁五月天| 欧美成人免费大片| 这里只有精品在线播放| 欧美极品美女视频网站在线观看免费| 久久精品国产精品亚洲| 国产精品久久久久久亚洲调教| 美女久久久久久久| 亚洲最新视频在线| 国产精品国产三级国产aⅴ浪潮| 国产精品福利片| 亚洲视屏在线播放| 久久精品久久久久久| 热re91久久精品国99热蜜臀| 久久综合久久88| 国产精品网站视频| 国产一区二区三区欧美| 久久久噜噜噜久噜久久| 亚洲人成电影网站色…| 久久精品男人天堂| www.久久色.com| 国内精品久久久久久| 亚洲视频在线免费观看| 久热精品视频在线| 日韩专区中文字幕| 亚洲国产精品网站| 亚洲女同性videos| 欧美一区亚洲一区| 国产精品久久久久久av下载红粉| 国产福利视频一区二区| 成人免费视频xnxx.com| 亚洲视频777| 欧美美女18p| 国产精品户外野外| 亚洲美女av电影| 亚洲一区二区久久| 国产成人久久久精品一区| 日韩国产精品亚洲а∨天堂免| 久久成人18免费网站| 亚洲国产精品久久| 91免费精品国偷自产在线| 亚洲精品国产成人| 在线免费观看羞羞视频一区二区| 亚洲缚视频在线观看| 92福利视频午夜1000合集在线观看| 国产91av在线| 欧美激情精品久久久久久蜜臀| 深夜精品寂寞黄网站在线观看| 久久久久久久久网站| 国产日韩欧美在线看| 中文字幕欧美精品在线| 日韩在线一区二区三区免费视频| 97在线视频一区| 97视频色精品| 日产精品久久久一区二区福利| 中文字幕欧美日韩在线| 亚洲精品日韩在线| 国产亚洲人成网站在线观看| 亚洲国产精品va在看黑人| 欧美一区二区三区免费观看| 国产精品第七十二页| 欧美日韩激情视频8区| 欧美大尺度电影在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲二区中文字幕| 亚洲夜晚福利在线观看| 91精品国产91久久久久久久久| 国产在线播放91| 国产精品成人一区二区三区吃奶| 国内精品模特av私拍在线观看| 亚洲变态欧美另类捆绑| 国产精品久久在线观看| 91精品在线观看视频| 久久久久久久999精品视频| 国产精品老牛影院在线观看| 精品动漫一区二区三区| 久久乐国产精品| 亚洲精品一区二区三区婷婷月| 国产欧美一区二区三区四区| 欧美性猛交xxxx富婆弯腰| 91丝袜美腿美女视频网站| 国产欧美日韩丝袜精品一区| 欧美亚洲在线观看| 亚洲国产精品va| 亚洲天堂免费观看| 日韩av在线高清| 亚洲图中文字幕| 欧美在线视频播放| 日韩精品在线电影| 欧美性黄网官网| 91福利视频在线观看| 中文欧美在线视频| 国产精品色午夜在线观看| 久久久久久久久久久国产| 欧美黑人又粗大| 国模gogo一区二区大胆私拍| 亚洲女人天堂色在线7777| 色偷偷噜噜噜亚洲男人| 97精品国产91久久久久久| 欧美亚洲成人精品| 久久精品一本久久99精品| 欧美日韩在线影院| 国产精品第一页在线| 中文字幕精品久久久久| 91在线观看免费高清完整版在线观看| 午夜精品久久久99热福利| 久久久av一区| 最近2019中文免费高清视频观看www99| 久久久久国产精品免费| 国产精品久久久久久久久粉嫩av| 精品国产一区久久久| 欧美日韩在线观看视频小说| 日韩亚洲欧美中文高清在线| 色午夜这里只有精品| 欧美性猛交xxx| 91国在线精品国内播放| 欧美性猛交xxxx乱大交| 欧美黑人国产人伦爽爽爽| 最近2019中文免费高清视频观看www99| 欧美精品久久久久久久| 日韩视频在线一区| 精品综合久久久久久97| 欧美精品videossex88| 亚洲国产精品热久久| 欧美激情视频在线| 精品国产自在精品国产浪潮| 日韩欧美精品网站| 国产精品av在线| 中文字幕欧美日韩在线| 亚洲成成品网站| 国产精品成人在线| 色偷偷偷亚洲综合网另类| 国产成人高清激情视频在线观看|