最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年04月13日 11:46:22   作者:bestswifter  
這篇文章主要介紹了Swift中switch語(yǔ)句對(duì)case的數(shù)據(jù)類型匹配的支持,Swift中switch...case語(yǔ)句支持多種數(shù)據(jù)類型的匹配判斷,十分強(qiáng)大,需要的朋友可以參考下

Swift可以對(duì)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

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

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

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

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

我們不妨動(dòng)手試一下,用switch匹配對(duì)象:

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")
}

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

我們做一下改動(dòng),在case語(yǔ)句后面加上let:

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

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

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

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")
}

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

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

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.
第一句解釋了之前的報(bào)錯(cuò),所謂的“express pattern”是指表達(dá)式的值,這個(gè)概念只在switch的case標(biāo)簽中有。所以之前的報(bào)錯(cuò)信息是說(shuō):“o1這個(gè)表達(dá)式的值(還是o1)與傳入的參數(shù)o都是類型A的,但它們無(wú)法匹配”。至于為什么不能匹配,答案在第二句話中,因?yàn)閛1和o的匹配是通過調(diào)用標(biāo)準(zhǔn)庫(kù)中的~=運(yùn)算符完成的。

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

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

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

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

最后總結(jié)一句:

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

相關(guān)文章

  • Swift UIButton使用教程

    Swift UIButton使用教程

    這篇文章主要介紹了Swift UIButton的使用方法,幫助大家更好的理解和學(xué)習(xí)swift編程,感興趣的朋友可以了解下
    2020-09-09
  • Swift中 !和 ?的區(qū)別及使用

    Swift中 !和 ?的區(qū)別及使用

    這篇文章主要介紹了Swift中 !和 ?的區(qū)別及使用的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 使用swift實(shí)現(xiàn)計(jì)算器功能

    使用swift實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了使用swift實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift中switch語(yǔ)句區(qū)間和元組模式匹配

    Swift中switch語(yǔ)句區(qū)間和元組模式匹配

    這篇文章主要介紹了Swift中switch語(yǔ)句區(qū)間和元組模式匹配的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Swift 3中使用FMDB遇到的問題與解決方法

    Swift 3中使用FMDB遇到的問題與解決方法

    相信大家都熟悉OC使用FMDB第三方庫(kù),進(jìn)行數(shù)據(jù)庫(kù)操作,增、刪、改、查,但最近在Swift 3中使用FMDB遇到了一些問題,下面這篇文章主要給大家介紹了關(guān)于在Swift 3中使用FMDB遇到的問題與解決方法,需要的朋友可以參考下。
    2017-07-07
  • Swift如何為網(wǎng)頁(yè)承載頁(yè)面添加更多功能詳解

    Swift如何為網(wǎng)頁(yè)承載頁(yè)面添加更多功能詳解

    這篇文章主要給大家介紹了關(guān)于Swift如何為網(wǎng)頁(yè)承載頁(yè)面添加更多功能的相關(guān)資料,包括添加菊花加載的效果、添加跳轉(zhuǎn)到Safari的功能、添加復(fù)制鏈接的功能以及添加分享網(wǎng)頁(yè)的功能,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    Swift之for循環(huán)的基礎(chǔ)使用學(xué)習(xí)

    這篇文章主要為大家介紹了Swift之for循環(huán)的基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • swift guard關(guān)鍵字詳解及使用

    swift guard關(guān)鍵字詳解及使用

    這篇文章主要介紹了swift guard關(guān)鍵字詳解及使用的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Swift Json實(shí)例詳細(xì)解析

    Swift Json實(shí)例詳細(xì)解析

    這篇文章主要給大家介紹了關(guān)于Swift Json解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Swift解決UITableView空數(shù)據(jù)視圖問題的簡(jiǎn)單方法

    Swift解決UITableView空數(shù)據(jù)視圖問題的簡(jiǎn)單方法

    這篇文章主要給大家介紹了關(guān)于Swift解決UITableView空數(shù)據(jù)視圖問題的簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2018-10-10

最新評(píng)論

黔东| 油尖旺区| 浠水县| 黄陵县| 广东省| 文化| 新宾| 蒙城县| 黄冈市| 开江县| 金昌市| 温州市| 上饶县| 四会市| 连州市| 文成县| 富川| 东乡县| 沙雅县| 门头沟区| 亚东县| 涿鹿县| 盐亭县| 山阳县| 东乡县| 新兴县| 临江市| 蒙城县| 黄山市| 桂阳县| 苗栗市| 来宾市| 西青区| 扎赉特旗| 乐昌市| 华亭县| 石家庄市| 青冈县| 衡南县| 济宁市| 滨海县|