iOS Swift 里的捕獲變量
在 Swift 中,閉包不僅可以作為函數的簡潔表達方式,還能捕獲和存儲其所在上下文中的常量和變量。捕獲的變量會隨著閉包的生命周期延續,即使這些變量已經超出了原作用域,它們仍然可以在閉包中被訪問和修改。這種行為被稱為閉包捕獲,是閉包的核心特性之一。
//變量值捕獲
func makeIncrementer() -> () -> Int { var total = 0 // 這是外部變量 let incrementer: () -> Int = { total += 1 // 閉包捕獲了外部變量 total return total } return incrementer } let increment = makeIncrementer() print(increment()) // 輸出 1 print(increment()) // 輸出 2
// 在這個例子中,total變量是在makeIncrementer函數內定義的,它對incrementer閉包來說是“外部”的。但由于閉包捕獲了這個外部變量,total可以在閉包內部被修改和訪問。
//引用類型捕獲
class ReferenceType { var value: Int = 0 } func referenceClosure() -> () -> Int { let ref = ReferenceType()//函數內聲明了一個局部變量 let closure: () -> Int = { ref.value += 1 //閉包內修改外界變量 return ref.value } return closure } let closureRef = referenceClosure() print(closureRef()) // 輸出 1 print(closureRef()) // 輸出 2
//closure是一個閉包,它捕獲了ReferenceType的實例ref。這個ref是referenceClosure函數中的局部變量,但由于被閉包捕獲,在referenceClosure返回后,ref仍然存在于閉包中,并且它的value屬性可以繼續被修改。
為什么閉包要捕獲外部變量?
閉包需要捕獲外部變量,主要是為了保持它們的狀態,即使閉包所在的作用域已經結束。
- 如果一個變量定義在函數內部,但閉包捕獲了它,該變量就不會隨著函數的結束而銷毀。閉包可以長期持有該變量的引用,并在后續調用時繼續使用它。
- 閉包內部變量:是在閉包的代碼塊內部定義并使用的變量,通常只能在閉包內訪問。
- 外部變量:是在閉包所在的作用域(函數或其他代碼塊)中定義,但被閉包引用的變量。由于它們是在閉包外部定義的,所以稱為“外部變量”。
posted on 2024-10-17 15:49 ACM_Someone like you 閱讀(91) 評論(0) 收藏 舉報
浙公網安備 33010602011771號