스위프트의 여러타입을 선언하는 것처럼 함수타입을 선언할 수 있습니다.
즉, 함수를 만들어 변수에 할당하고, 해당 변수를 사용하여 해당 함수를 호출하고, 해당 함수를 다른 함수에 매개 변수로 전달할 수도 있습니다.
→ 이러한 방식으로 사용되는 함수를 클로저라고 합니다.
let driving: () -> () = {
print("I'm driving in my car")
}
driving()
클로저를 사용하는 이유가 뭘까?
일반적인 이유 중 하나는 기능을 저장한 후 필요할 때 사용하기 위해서입니다.
클로저에서는 매개변수를 받을 수 있지만 받는 방식이 다릅니다.
매개변수를 받기 위해서는 {}
괄호 안에 매개변수를 ()
에 나열한 다음 in
키워드 뒤에 실행할 코드를 작성합니다.
let driving: (String, Int) -> () = { (name: String, number: Int) in
print("My Car is \(name) - \(number)")
}
driving("Tico", 213)
함수와 클로의 차이점 중 하나는 클로저를 실행할 때 매개 변수 레이블을 사용하지 않는다는 것입니다. 클로저 내부에서는 매개변수 레이블 사용
클로저는 외부 매개변수 이름을 지정할 수 없습니다.
클로저는 매개변수명을 지정해야합니다 자료형만 입력하면 에러 발생
클로저는 매개변수 타입을 생략할 수 없습니다.
클로저는 값을 반환할 수 있습니다. 클로저 내부의 in
키워드 바로 앞에 작성합니다.
let drivingWithReturn: (String) -> String = { (place: String) -> String in
return "I'm going to \(place) in my car"
}
매개변수가 없는 경우에 반환하고 싶으면 어떻게 할까?
함수에서와 동일하게 작동합니다 ()
빈 괄호를 사용합니다.
// MARK - 매개 변수를 받아들이지 않고 값을 반환
let closurePayment = { () -> Bool in
print("Paying an anonymous person…")
return true
}
func functionPayment() -> Bool {
print("Paying an anonymous person…")
return true
}
클로저는 타입처럼 사용할 수 있기 때문에 함수에 매개변수로 클로저를 전달할 수 있습니다.
클로저를 매개변수로 사용하면 비동기방식처리를 할 때 유용합니다. 끝났을 때 할 행동을 취할 수 있습니다. (네트워크 요청, 백그라운드 실행작업 등등)
let driving: () -> Void = {
print("I'm driving in my car")
}
func travel(action: () -> ()) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
travel(action: driving)
💡 Void는 아무것도 반환하지 않는다는 뜻
함수에 대한 마지막 매개변수가 클로저인 경우 스위프트는 trailing closure syntax
후행클로저 구문이라는 특수한 구문을 사용할 수 있습니다.
// MARK - 클로저가 매개변수 마지막인경우
func travel(name: String, action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
print("My \(name)")
}
travel(name: "Taylor") {
print("I'm driving in my car")
}
// MARK - 후행클로저 사용안 한 경우
travel(name: "Taylor", action: {
print("I'm driving in my car")
})
// MARK - 클로저가 매개변수 마지막이 아닌 경우
func travel(action: () -> Void, name: String) {
print("I'm getting ready to go.")
action()
print("I arrived!")
print("My \(name)")
}
travel(action: {
print("I'm driving in my car")
}, name: "Taylor")
})
를 사용하지 않을 수 있습니다.후행 클로저를 사용하는 경우 매개변수 외부이름을 지정할 수 있습니다.
func goCamping(then action: () -> Void) {
print("We're going camping!")
action()
}
goCamping {
print("Sing songs")
print("Put up tent")
print("Attempt to sleep")
}
goCamping(then: {
print("Sing songs")
print("Put up tent")
print("Attempt to sleep")
})