TIL
< 클로저에서 capture list를 쓰는 이유 >
참조 블로그
var index = 0
var closureArr: [() -> ()] = []
for _ in 1...5 {
closureArr.append({print(index)})
index += 1
}
for i in 0..<closureArr.count {
closureArr[i]()
}
왜 이런 현상이 발생할까 ? closureArr
에 들어간 { print(index) } 코드에서 참조하는 index 값이 가장 최근값인 5로 모두 업데이트가 되어있다. for문의 클로저 바디에서 그때그때의 index 값을 참조하고 싶을 때, capture list 를 이용한다.
var index = 0
var closureArr: [() -> ()] = []
for _ in 1...5 {
closureArr.append({ [index] in // 캡쳐리스트를 사용!
print(index)
})
index += 1
}
for i in 0..<closureArr.count {
closureArr[i]()
}
func doSomething() {
var num: Int = 0
print("num check #1 = \(num)")
let closure = { [num] in // 캡쳐리스트를 사용!
print("num check #3 = \(num)")
}
num = 20
print("num check #2 = \(num)")
closure()
}
doSomething()
num check #1 = 0
num check #2 = 20
num check #3 = 0
class Human {
var name: String = "Wongbing"
}
var human1: Human = .init()
let closure = { [human1] // 캡처리스트
print(human1.name)
}
human1.name = "Unknown"
closure()
참조타입
을 캡쳐하기 때문!!class Human {
var name = ""
lazy var getName: () -> String = {
return self.name
}
init(name: String) {
self.name = name
}
deinit {
print("Human Deinit!")
}
}
var wongbing: Human? = .init(name: "Wongbing")
print(wongbing!.getName())
wongbing = nil
class Human {
var name = ""
lazy var getName: () -> String = { [unowned self] in
return self.name
}
init(name: String) {
self.name = name
}
deinit {
print("Human Deinit!")
}
}
var wongbing: Human? = .init(name: "Wongbing")
print(wongbing!.getName())
wongbing = nil
🛠 혹시나 그림에 잘못 표현된것이 있다면 지적 및 딴지 환영입니다 🛠