😎 클로저는 중요한 개념이니까 다시 보자 몽이 누나
💬 다음은 completion이라는 클로저를 매개변수로 가지는 메소드를 정의한 것입니다.
ex)
func sayHi(completion: () -> Void) {
print("sayHi() called")
sleep(2) // 2초 멈추기
// completion이라는 클로저 실행
completion()
}
>>> sayHi() called
💬 클로저는 축약이 용이합니다.
💬 정의한 메소드를 호출하는 방법 3가지를 알아봅시다.
sayHi(completion: {
print("2초가 지났다. 1")
})
>>> sayHi() called
2초가 지났다. 1
sayHi() {
print("2초가 지났다. 2")
}
>>> sayHi() called
2초가 지났다. 2
sayHi{
print("2초가 지났다. 3")
}
>>> sayHi() called
2초가 지났다. 3
ex)
func sayHiWithName(completion:(String) -> Void) {
print("sayHiwithName() called")
sleep(2)
// 클로저를 실행과 동시에 데이터를 반환
completion("행복한 몽이 누나")
}
💬 정의한 메소드를 호출하는 방법 4가지를 알아봅시다.
sayHiWithName(completion: { (comment: String) in
print("2초 뒤에 그가 말했다. comment : ", comment)
})
>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment : 행복한 몽이 누나
sayHiWithName(completion: {comment in
print("2초 뒤에 그가 말했다. comment : ", comment)
})
>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment : 행복한 몽이 누나
sayHiWithName{comment in
print("2초 뒤에 그가 말했다. comment : ", comment)
}
>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment : 행복한 몽이 누나
💡 달러 싸인
은 $0, $1 ...과 같이 표현하고, 들어오는 순서대로 숫자를 적으면 됩니다.
sayHiWithName{
print("2초 뒤에 그가 말했다. comment : ", $0)
}
>>> sayHiwithName() called
2초 뒤에 그가 말했다. comment : 행복한 몽이 누나
ex)
func sayHiOptional(completion: (() -> Void)? = nil) {
print("sayHi() called")
sleep(2) // 2초 멈추기
// completion이라는 클로저 실행
completion?()
}
💬 호출해봅시다.
sayHiOptional(completion: {
print("간식 먹는 몽이")
})
>>> sayHi() called
간식 먹는 몽이
💬 어떠한 형태를 받아서 다른 형태로 바꿀 때 많이 사용하는 모양으로, 콜렉션을 활용할 때 많이 사용합니다. (연산자 등)
ex)
💡 실행할 때 엔터를 두 번 치면 클로저로 변환되는 것을 확인할 수 있습니다.
var myNumbers : [Int] = [0, 1, 2, 3, 4, 5]
var transformedNumbers = myNumbers.map { aNumber in
return "숫자: \(aNumber)"
}
💬 다른 표현 방법
var transformedNumbers2 = myNumbers.map { (aNumber: Int) -> String in
return "숫자: \(aNumber)"
}
var transformedNumbers3 = myNumbers.map {
return "숫자: \($0)"
}
함수를 선언했을 때의 결과값과 클로저의 결과값이 같은데, Closure를 사용하는 이유는
한 두번 사용하고 말 내용을굳이 함수로 구현하여 메모리 낭비할 필요성
이 없기 때문입니다.
때문에 코드 블럭인 클로저를 사용합니다.