클로져는 참조 타입이다
클로져 값 캡쳐링에서 봤던 예제를 다시 살펴 보겠습니다.
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
total += amount
return total
}
return incrementer
}
let incrementBySeven = makeIncrementer(forIncrement: 7)
incrementBySeven() // 7을 반환
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
incrementByTen()
incrementByTen()
incrementByTen() // 40을 반환
위 예제에서, incrementBySeven
과 incrementByTen
은 상수입니다. 하지만 이 상수들이 참조하는 클로져는runningTotal
변수를 증가합니다. 왜냐하면 함수와 클로져는 참조 타입(reference types) 이기 때문입니다.
함수나 클로져를 변수나 상수에 할당하면, 이것은 함수나 클로져에 참조를 만드는 것과 같습니다. 위 예제에서는, incrementByTen
이 가리키는 클로져는 상수입니다. 이것은 클로져 자체가 아닙니다.
여러분이 두 개의 다른 상수나 변수에 어떤 하나의 클로져를 할당하면, 이 둘의 상수 혹은 변수는 같은 클로져를 가리킨다는 것입니다.
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen() // 50을 반환
IncrementByTen() // 60을 반환
이 예제는 alsoIncrementByTen
을 호출하는 것이 결국 incrementByTen
을 호출하는 것과 같음을 보여줍니다. 왜냐하면 두 상수 모두 같은 클로져를 가리키고 있기 때문이므로 이 두 상수는 같은 runningTotal
을 증가하여 반환합니다.
원문 : https://docs.swift.org/swift-book/LanguageGuide/Closures.html
'Swift > Swift Language' 카테고리의 다른 글
Swift의 Algebraic Data Type (0) | 2021.03.24 |
---|---|
Swift 언어 가이드 - 서브스크립트 Subscript (0) | 2020.04.12 |
Swift 언어 가이드 - 값 캡쳐링 (0) | 2020.03.06 |
Swift 언어 가이드 - 트레일링 클로져 (0) | 2020.03.05 |
Swift 언어 가이드 - 클로져 기본 (0) | 2020.03.05 |