벌써 6일차까지 왔네요
대망의 closure
파트 열심히 해봅시다.
Swift는 Int
나 String
같은 타입들처럼 함수를 사용할 수 있게 해줘요.
이말인 즉슨 함수를 변수에 할당할 수도 있다는거에요
그러면 그 변수를 사용해서 함수를 사용할 수도있고 다른 함수에 그 함수를 파라미터로 넘겨줄 수도 있답니다.
이런 방식으로 쓰이는 함수를 바로 closure
라고 합니다.
이들은 보통의 함수와 똑같이 작동하는데요 작성법만 조금 달라유
간단한 예시로 확인해볼게유
let driving = {
print("I'm driving in my car")
}
이름 없는 함수를 생성해서 driving
변수에 할당해줬어유
driving()
으로 호출해서 위의 함수를 사용할 수 있습니다.
driving()
따-란
closure
를 생성할 때 파라미터를 위한 공간이나 이름이 없어요
근데 이게 파라미터를 안 받는걸 뜻하진 않습니다. 다른 방식으로 할 뿐이죠
closure
가 파라미터를 받게하려면 {
바로 뒤()
안에 in
키워드와 함께 작성해주면 됩니다. 여기서 in
은 swift가 closure
의 main body가 시작하는 부분을 알게 해줍니다
예를 들어서 장소 이름을 파라미터로 받는 closure
를 작성해볼게요
let driving = { (place:string) in
print("I'm going to \(place) in my car.")
}
함수랑 closure
간의 차이점 중 하나는 closure
를 사용할 때 파라미터의 label을 사용하지 않는것입니다. 그래서 driving()
을 호출할 때 아래처럼 작성해요
driving("London")
closure
는 값을 반환할 수도 있어요.
텍스트in
키워드 바로 앞에 반환할 타입명을 작성해주시면 됩니다.
확인해보기위해서 driving()
을 바로 출력하던것에서 값을 반환하는 형식으로 바꿔볼게요
let driving = { (place: String) in
print("I'm going to \(place) in my car")
}
이건 원본이구요
let drivingWithReturn = { (place: String) -> String in
return "I'm going to \(place) in my car"
}
값을 반환하는 다른 함수들 처럼 return
도 추가해줬어요
이제 message
라는 변수에 할당해서 값을 출력해보죠
let message = drivingWithReturn("London")
print(message)
closure
가 Int
나 String
처럼 사용할 수 있기 때문에 함수에도 넘겨줄 수 있슴다. 약간 복잡한데 쉬운거부터 가보자구요
우선 driving()
기본 형태부터 다시보죠
let driving = {
print("I'm driving in my car.")
}
이 closure
를 함수에 넘겨서 함수 내부에서 사용되도록 하려면 파라미터의 타입을 -> Void()
로 해줘야 합니다.
이게 뭔 뜻이냐면 '파라미터를 받지않고 Void를 반환한다'라고 합니다.
그냥 Swift식으로 아무것도 아닌 것을 나타낸거에요
이제 여러가지 활동에 대한 파라미터를 받는 travel()
함수를 작성해보죠
func travel(action: () -> Void){
print("I'm getting ready to go.")
action()
print("I arrived!")
}
두개의 print
함수 사이에 파라미터로 받은 action
을 출력하는 함수입니다.
이제 우리가 작성한 closure
를 파라미터로 넣어서 함수를 호출해보죠
travel(action: driving)
의도한대로 출력되는 것을 확인할 수 있네요
만약 함수의 마지막 인자(parameter)가 closure
이면
Swift는 trailing closure
라는 문법을 사용하게 해줌다.
closure
를 파라미터로 넘겨주지 않고 함수 다음에 {}
안에 작성해주는 방법입니다. 뭔 말이냐
이게 첨에 이해가 안가서 몇 번 읽어봤는데 예시를 보는게 더 이해가 빠르더라구요. 예시로 보시죠!
func travel(action: () -> Void) {
print("I'm getting ready to go.")
action()
print("I arrived!")
}
앞에 썼던 travel()
함수 기억하시죠? 두 개의 print()
사이에 인자로 받은 closure
를 출력하는 함수죠
여기서 처음이자 마지막으로 받는 인자가 closure
이기 때문에
trailing closure
문법을 사용해 볼게요
travel() {
print("I'm driving in my car")
}
이제 이해가 가시나요?
함수를 호출하고 {}
사이에 closure
를 작성해주는 겁니다.
앞에서는 driving()
을 작성하고 travel(action: driving)
호출해서 사용했죠. 조금 더 코드가 간략해졌습니다
아 그리고 다른 인자를 받지 않기 때문에 ()
를 생략할 수도 있어요.
travel {
print("I'm driving in my car")
}
잘 작동하네요.
driving()
을 따로 작성 안해서 간결한 모습입니다.
이 문법은 Swift에서 흔히 사용되는 문법이라 익숙해지는게 좋습니다.