神奇的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是一門類型安全的語言,即使是UInt16
和UInt32
也不能直接比較稼稿,也要轉換成UInt16
vsUInt16
或者 UInt32
vsUInt32
才能進行比較薄榛,更何況是將值類型和數組類型進行對比。
難道沒有辦法了嗎渺杉?
辦法是有的蛇数!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等等高級用法來減少代碼量突那,提高代碼的可閱讀行构眯。