StringUtil工具類驗證手機號,郵箱,身份證號,實現檢查密碼強弱等
阿新 • • 發佈:2020-12-31
逃逸閉包&自動閉包
逃逸閉包的定義: 當閉包作為⼀個實際引數傳遞給⼀個函式的時候,並且是在函式返回之後調⽤,我們就說這個閉包逃逸了。當我們宣告⼀個接受閉包作為形式引數的函式時,你可以在形式引數前寫 @escaping 來明確閉包是允許逃逸的。當前我們的 ` complitionHandler 作為當前 KZH Teacher 是在當前⽅法 makeIncrementer 調 完成之後才會調⽤,這個時候閉包的⽣命週期是要⽐當前⽅法的⽣命週期⻓,所以我們說 ` complitionHandler `這個閉包逃逸了.class KZHTeacher { var complitionHandler: ((Int)->Void)? func makeIncrementer(amount: Int, handle: @escaping (Int)->Void) { var runningTotal = 0 runningTotal += amount self.complitionHandler = handle } func doSomething() { self.makeIncrementer(amount: 10) { print($0) } } } let kzhT = KZHTeacher() kzhT.doSomething() kzhT.complitionHandler?(10) kzhT.makeIncrementer(amount: 10) {_ in }
⾃動閉包
我們先來看下⾯這個例⼦上述程式碼會在當前 conditon 為 true 的時候,列印我們當前的錯誤資訊,也就意味著 false 的時 候當前條件不會執⾏。 如果我們當前的字串可能是在某個業務邏輯功能中獲取的, ⽐如下⾯這樣寫:func debugOutPrint(_ condition: Bool , _ message: String) { if condition { print("lg_debug:\(message)") } } debugOutPrint(true, "Application Error Occured")
func debugOutPrint(_ condition: Bool , _ message: String){ if condition { print("lg_debug:\(message)") } } func doSomething() -> String{ //do something and get error message return "NetWork Error Occured" } debugOutPrint(true, doSomething())
這個時候我們會發現⼀個問題,那就是當前的 conditon,⽆論是 true 還是 false ,當前的⽅法都會執 ⾏。如果當前的 doSomething 是⼀個耗時的任務操作,那麼這⾥是不是就造成了⼀定的資源浪費啊。
這個時候我們想到的是把當前的引數修改成⼀個閉包:func debugOutPrint(_ condition: Bool , _ message: () -> String){
if condition {
print("lg_debug:\(message)")
}
}
func doSomething() -> String{
//do something and get error message
return "NetWork Error Occured"
}
debugOutPrint(true, doSomething())
這樣的話是不是就能夠正常在當前條件滿⾜的時候調⽤我們當前的
doSomething
的⽅法啊。同樣的問 題⼜隨之⽽來了,那就是這⾥是⼀個閉包,如果我們這個時候就是傳⼊⼀個 String
怎麼辦那?
func debugOutPrint(_ condition: Bool , _ message: @autoclosure () -> String){
if condition {
print("lg_debug:\(message)")
}
}
func doSomething() -> String{
//do something and get error message
return "NetWork Error Occured"
}
debugOutPrint(true, doSomething())
debugOutPrint(true, "Application Error Occured")
上⾯我們使⽤ `
@autoclosure
` 將當前的表示式宣告成了⼀個⾃動閉包,不接收任何引數,返回值是當 前內部表示式的值。所以實際上我們傳⼊的 String
就是放⼊到⼀個閉包表示式中,在調⽤的時候返回.