Swift面試題之 defer

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.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章