[Swift] Day6 - Closures, part one

한철희·2023년 2월 25일
0

100 DaysOfSwift

목록 보기
2/11

벌써 6일차까지 왔네요
대망의 closure 파트 열심히 해봅시다.

Day6

Closures, part one


Creating basic closures

Swift는 IntString 같은 타입들처럼 함수를 사용할 수 있게 해줘요.
이말인 즉슨 함수를 변수에 할당할 수도 있다는거에요
그러면 그 변수를 사용해서 함수를 사용할 수도있고 다른 함수에 그 함수를 파라미터로 넘겨줄 수도 있답니다.

이런 방식으로 쓰이는 함수를 바로 closure라고 합니다.
이들은 보통의 함수와 똑같이 작동하는데요 작성법만 조금 달라유

간단한 예시로 확인해볼게유

let driving = {
	print("I'm driving in my car")
}

이름 없는 함수를 생성해서 driving 변수에 할당해줬어유
driving() 으로 호출해서 위의 함수를 사용할 수 있습니다.

driving()

따-란


Accepting parameters in a closure

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")


Returning values from a closure

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)


Closures as parameters

closureIntString처럼 사용할 수 있기 때문에 함수에도 넘겨줄 수 있슴다. 약간 복잡한데 쉬운거부터 가보자구요

우선 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)


의도한대로 출력되는 것을 확인할 수 있네요


Trailing closure syntax

만약 함수의 마지막 인자(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에서 흔히 사용되는 문법이라 익숙해지는게 좋습니다.


profile
초보 개발자 살아남기

0개의 댓글