對于Swift的樣式匹配,你知道多少呢,這里讓bekin簡單介紹一些在實際應用中可以讓你快速判斷一些條件,或者是分支的樣式匹配語法,會大大簡化你的代碼量,話不多說,直接上代碼:
1,if let的使用
這個相信大家也用的很多了,這個在判斷optional值的時候非常有用,例如判斷window的根控制器是不是導航控制器,接下來并且需要用這個導航控制器干點啥的時候,可以這樣簡寫
if let nav = self.window?.rootViewController as? UINavigationController {
? ? ? ? ? ? ///do something
? ? ? ? }
if let 可以不僅僅在判斷條件成立的時候執行代碼,還可以綁定=后面的值到let的常量中,當然把let換成var也是可以的,是不是簡便很多,相信很多人會這樣用了,接下來說說其他的
2,if case的使用
比如有一個坐標點point (x: 100, y: 0),當你想判斷該坐標是不是在原點的時候,以前你的代碼或許是這樣的:
if point.x == 0 && point.y == 0 {
? ? ///do something
}
用樣式匹配以后,代碼是這樣的:
if case (0, 0) = point {
? ? ///do something
}
是不是簡潔很多,當然配上我們的value binding那就更爽啦,比如現在只想判斷這個點在不在y軸,同時還需要用到point的x軸的值,那么可以這樣用:
if case(let x, 0)? = point {
? ? print("Y軸,X為:\(x)")
}
如果不需要x的值,更可以省略x的值判斷了,像這樣:
if case(_, 0)? = point {
? ? print("在Y軸")
}
這樣用起來是不是方便很多
3,switch...case...的用法
還是2里面提到的point,如果同時需要判斷在原點,在x軸,在y軸,一起其他情況的時候,我們可以用switc...case
switch point {
case(0,0):
? ? print("原點")
case(_,0):
? ? print("Y軸")
case(0,_):
? ? print("X軸")
default:
? ? print("不在X軸,也不再Y軸")
}
如果要value binding,那就和上面的if case一樣
4,for...case的用法
比如有一個數組 nums [1, 2, 3, 4]
當我們判斷只要2在里面的時候就干一些事情,當然你可以調用數組的API contains方法,這里不說這個,我們用樣式匹配符可以這樣:
for case 2 in nums {
?????print("找到2啦,你可以干一些活啦")
}
不過需要說明的是,如果數組里面有多個元素2,那么這個print將會執行2的count次,也就是說不管有沒有找到2,這個for case都會把這個數組for循環完畢,這個大家用的時候需要注意
當然還有更高級的用法,比如numsO [1, 2, 3, nil, 6, nil, 10]這樣一個數組,如果要在元素不為空的時候干一些事情,那么你可以這樣寫:打印結果為:1,2,3,6,10,
for case let n? in numsO {
? ? print(n)
///do something
}
是不是很有意思!!!
5,在if或者是for后面添加where的用法
比如有一個表示電池電量的枚舉BatteryPower ,有三種狀態,一種是沒電了outOfPower,一種是full,另外一種是normal,但是現在需要在normal的基礎上根據電量的百分比增加兩種狀態,一種的低電量狀態,另外一種是幾乎滿電狀態,那么可以在switc case的時候加上where來加以限制,代碼如下:
enum BatteryPower? {
? ? case full, outOfPower
? ? case normal(percent: Double)
}
var battery: BatteryPower = .normal(percent:0.25)
switch battery {
? ? case.full:
? ? ? ? print("full power")
? ? case .outOfPower:
? ? ? ? print("out of power")
? ? case.normal(let p) where p <= 0.2:
? ? ? ? print("almost out of power")
? ? case.normal(let p) where p? >= 0.8:
? ? ? ? print("almost full power")
? ? default:
? ? ? ? print("normal power")
}
當然where不僅僅可以用在switch...case里面,還可以配上for循環,if條件判斷使用,例如針對2里面提到的數組nums ?[1, 2, 3, 4],如果僅僅是在元素的值為偶數的時候需要做一些事情,你可以這樣寫:這樣你就不需要在for循環里面添加if判斷了,是不是感覺簡化很多了
for n in nums where n %2 == 0 {
? ? print(n)
}
以上局勢針對樣式匹配符的一些簡單介紹和應用