1. 程式人生 > 其它 >StringUtil工具類驗證手機號,郵箱,身份證號,實現檢查密碼強弱等

StringUtil工具類驗證手機號,郵箱,身份證號,實現檢查密碼強弱等

技術標籤:iosswift

逃逸閉包&自動閉包

逃逸閉包的定義: 當閉包作為⼀個實際引數傳遞給⼀個函式的時候,並且是在函式返回之後調⽤,我們就說這個閉包逃逸了。當我們宣告⼀個接受閉包作為形式引數的函式時,你可以在形式引數前寫 @escaping 來明確閉包是允許逃逸的。
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 }
當前我們的 ` complitionHandler 作為當前 KZH Teacher 是在當前⽅法 makeIncrementer 調 完成之後才會調⽤,這個時候閉包的⽣命週期是要⽐當前⽅法的⽣命週期⻓,所以我們說 ` complitionHandler `這個閉包逃逸了.

⾃動閉包

我們先來看下⾯這個例⼦
func debugOutPrint(_ condition: Bool , _ message: String) {
        if condition {
            print("lg_debug:\(message)")
        }
    }
debugOutPrint(true, "Application Error Occured")
上述程式碼會在當前 conditon true 的時候,列印我們當前的錯誤資訊,也就意味著 false 的時 候當前條件不會執⾏。 如果我們當前的字串可能是在某個業務邏輯功能中獲取的, ⽐如下⾯這樣寫:
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 就是放⼊到⼀個閉包表示式中,在調⽤的時候返回.