Swift重載運算符在switch-case中的模式匹配

神奇的Swift

swift的switch-case語句可以非常靈活的進行匹配,每個case段可以對應一個或多個匹配項,這比其他語言都要好用锄码。比如蘋果官方文檔中列舉了一個例子

for thing in things {
    switch thing {
    case 0 as Int:
        print("zero as an Int")
    case 0 as Double:
        print("zero as a Double")
    case let someInt as Int:
        print("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        print("a positive double value of \(someDouble)")
    case is Double:
        print("some other double value that I don't want to print")
    case let someString as String:
        print("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        print("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        print("a movie called '\(movie.name)', dir. \(movie.director)")
    case let stringConverter as String -> String:
        print(stringConverter("Michael"))
    default:
        print("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
// Hello, Michael

一個例子

默認情況下善茎,case后面是不支持Array數組的捏肢,如果你使用數組當作case的匹配條件的話,編譯就會失敗厘惦,比如下面這種情況:

let number = 0
let luckyNums = [8, 88, 888]
switch number {
case 0:
    print("= 0.")
case luckyNums: //此處報錯
    print("It's lucky number.")
default:
    print("Other.")
}

編譯器給你彈了個紅紅的感嘆號偷仿,告訴你:Expression pattern of type '[Int]' cannot match values of type 'Int'
意思是,Int值不能與[Int]值進行匹配宵蕉。

我們都知道計算機是無法對比兩個不同類型的值的酝静,很明顯,Int是整型羡玛,[Int]是整型數組别智。swift是一門類型安全的語言,即使是UInt16UInt32也不能直接比較稼稿,也要轉換成UInt16vsUInt16 或者 UInt32vsUInt32才能進行比較薄榛,更何況是將值類型和數組類型進行對比。

難道沒有辦法了嗎渺杉?

辦法是有的蛇数!switch-case結構將傳入的值與case分支進行比較,編譯器會將它們進行模式匹配是越,也就是~=(不是==)運算符耳舅,如果編譯器找不到這兩種類型的模式匹配規(guī)則(方法),那么就會報錯,因此我們只需重載~=運算符就可以實現匹配數組了馏予。

添加一個全局的重載方法:

func ~=<T: Equatable>(lhs: [T], rhs: T) -> Bool {
    for tmp in lhs where rhs == tmp{
        return true
    }
    return false
}

前面的例子中,我們可以看到紅色感嘆號消失了霞丧。number重新賦值:

let number = 8  //or 88, 888

Playground輸出:

It's lucky number.

結束

通過重載~=運算符冕香,可以看出swift的代碼其實是非常靈活的蛹尝,工程中可以通過重載運算符、extension悉尾、萬能的enum等等高級用法來減少代碼量突那,提高代碼的可閱讀行构眯。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惫霸,隨后出現的幾起案子猫缭,更是在濱河造成了極大的恐慌,老刑警劉巖壹店,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜丹,死亡現場離奇詭異茫打,居然都是意外死亡,警方通過查閱死者的電腦和手機老赤,發(fā)現死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弊予,“玉大人,你說我怎么就攤上這事汉柒。” “怎么了碾褂?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵历葛,是天一觀的道長。 經常有香客問我,道長帜羊,這世上最難降的妖魔是什么鸠天? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮稠集,結果婚禮上,老公的妹妹穿的比我還像新娘忧饭。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布鳖宾。 她就那樣靜靜地躺著逆航,像睡著了一般鼎文。 火紅的嫁衣襯著肌膚如雪因俐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天撑帖,我揣著相機與錄音澳眷,去河邊找鬼胡嘿。 笑死钳踊,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缴罗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼面氓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侧但?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤禀横,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酿箭,有當地人在樹林里發(fā)現了一具尸體趾娃,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年妇蛀,在試婚紗的時候發(fā)現自己被綠了笤成。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评架。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡炕泳,死狀恐怖,靈堂內的尸體忽然破棺而出浙芙,到底是詐尸還是另有隱情,我是刑警寧澤嗡呼,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布节仿,位于F島的核電站,受9級特大地震影響廊宪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜壕翩,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一傅寡、第九天 我趴在偏房一處隱蔽的房頂上張望北救。 院中可真熱鬧,春花似錦珍策、人聲如沸宅倒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至线召,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哈打,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工前酿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹏溯,地道東北人淹仑。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像匀借,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吓肋,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內容