Swift

Swift) 클로저 Closure

나태한개발 2024. 5. 9. 00:38

오늘은 함수를 이어서 클로저를 정리 해볼까 한다.

 

클로저란?

 

보통은 익명함수를 말한다. (Unnamed Closure)

하지만 평소에 쓰는 func name 이 붙은 함수도 클로저라고 한다. (Named Closure)

func function() { //함수
    print("Named Closure")
}

let closure = { print("Unnamed Closure") } //클로저

 

클로저 기본 형식

{(파라미터) -> 리턴타입 in 
실행할 코드}

ex)
{(text: String) -> Int in 
return text.count}

{() -> () 
print("안녕하세요")}

 

Argument Label 을 사용하지 않는다.

let closure = {(text: String) -> Int in 
return text.count}

closure("123456") //6
closure(text: "123456") //에러남

 

클로저 실행방법

let closure = { () -> () in
    print("클로저 입니다.")
}

closure() //()를 사용하여 실행시킨다

({ () -> () in 
     print("바로 실행 합니다.") 
})()
//()로 감싸고 ()를 사용하면 일회용으로 실행하는 클로저도 만들수 있다.

 

 

클로저 축약문법

func runClosure(closure: () -> ()) {
    closure() //파라미터로 받은 클로저를 실행한다.
}

 

위에 함수처럼 파라미터를 클로저 하나만 받는 함수가 있다면

 

runClosure(closure: { () -> () in
    print("클로저 호출입니다.")
})

이런식으로 파라미터에 클로저를 담아 호출할 것이다.

 

파라미터를 클로저 하나만 받는 함수는 클로저를 소괄호 밖으로 뺀뒤에 파라미터이름을 생략하고 바로 소괄호 뒤에 바로 붙여서 쓸 수 있다.

가독성을 위해서 인거 같다.

runClosure () { () -> () in //소괄호에서 빼낸뒤 뒤에 붙임
    print("클로저 호출입니다.")
}
runClosure { () -> () in
    print("클로저 호출입니다.")
}

파라미터가 클로저 하나 뿐이면 소괄호도 생략가능

 

파라미터가 여러개 있는 함수도 문법을 축약할 수 있는데 많이 쓰이는 map 함수를 통해 설명을 해보겠다.

let arr1: [Int] = [1, 2, 3, 4, 5]
var arr2 = arr1.map({ (num: Int) -> Int in
	return num*3
})
/*이렇게 된것을 축약한 것인데 함수에 파라미터가 클로저 하나일 경우 ()를 생략 할수 있다.*/

arr1.map{ (num: Int) -> Int in 
	return num*3 
} //()생략

/*파라미터형식과 리턴형식도 생략할수 있다.*/

arr1.map{ (num) in 
	return num*3 
} //파라미터형식, 리턴형식 생략

/*파라미터를 인자 이름 축약(Shorthand Arguments Names)을 통하여 
$0표시를 통해 간단하게 표현할수 있다.*/

arr1.map{
	return $0*3 
} //파라미터와 in 을 생략해도 된다.

/*마지막으로 리턴문만 남았을 경우 그것마저 생략할수 있다.*/

arr1.map{ $0*3 } //map 함수의 가장 간단한 형태

 

'Swift' 카테고리의 다른 글

Swift)고차함수 filter  (0) 2024.05.10
Swift) 고차함수 map  (0) 2024.05.09
Swift) 함수 Function  (0) 2024.05.03
Swift) 기본 연산자  (2) 2024.05.01
Swift) 옵셔널(Optional)  (0) 2024.04.29