defer 執行時機,是在當前作用域結束後隨之執行。
defer 使用場景:
1.回收資源。使代碼整潔,方便管理。
比如給某個文件裏寫文件信息,寫完後要調用 fileHandle.closeFile() 進行關閉,如果中間有幾個業務邏輯 if 判斷 爲 true的話 可以提前做一些操作然後關閉。但是每個條件裏都要這麼寫,如果多的話 就會漏掉,這時就會造成資源浪費。 使用 defer 就可以避免遺漏。
func xxx{ let fileHandle = try FileHandle(forUpdatingUrl: url) defer { fileHandle.closeFile() } .......... }
2.使用指針過程,swift使用指針,難免會去開闢內存空間,去做初始化, 做資源回收時需要用 defer.
let count = 2
let pointer = UnsafeMutablePointer<Int>.allocate(capacity: count)
pointer.initialize(repeating: 0 , count : count)
先執行alloc 然後
defer {
pointer.deinitialize(count: count)
pointer.deallocate()
}
3. 進行網絡請求的過程中,網絡請求的回調函數,使用。比如請求處理業務邏輯比較多 寫的比較分散。
func netRequest(completion: ()-> Void) {
defer {
self.isLoading = true
completion()
}
guard error = nil
}
defer 面試題 例子1:
var a = 1
func add() -> Int {
defer {
a = a + 1
}
return a
}
var tmp = add()
print(tmp)
打印結果爲 1 。
defer 面試題 例子2 (也是注意事項):
func test () {
guard false else {
return
}
defer {
print("test")
}
}
test ()
defer 放在return 後面 不會執行,所以這裏不會打印。 應該放在 return 的前面纔會執行。
例子3:
func f() {
defer { print("first") }
print("89757")
}
先執行了 89757的打印,然後當前作用域結束後隨之執行,打印 first.